203 Commits

Author SHA1 Message Date
1bb869b43e capillary heater: heater is now a writable
The value should show the actual heater power, but
we do not know yet the address. Currently the value
is just equal to the maxheater parameter.
2025-11-27 17:55:52 +01:00
3ede9eb9f4 frappy_psi.logo: revised version after merging capillary heater
- check that dil5 still works!

Change-Id: Ibe98e64088f2f886888af170a1f38d699927eb58
2025-11-27 09:32:37 +01:00
f57400feb9 frappy_psi.picontrol: stop when switching to manual mode
Change-Id: I3ffb9a109fb3b04fbca06f5a72acbfbd19525aae
2025-11-27 07:49:29 +01:00
38dd5b8ebb frappy_psi.ips_classic: small fixes
Change-Id: I6dcfc48d247a5581e969717b57675cf5d4cc34f7
2025-11-25 09:59:15 +01:00
3cc9cadeb9 frappy_psi.ips_classic: add skeleton code
Change-Id: I99d5c66e1b995559f3a8d876a91d904bf88904aa
2025-11-25 09:56:53 +01:00
dfb8037a65 frappy_psi.ahcapbridge: fix loss unit mechanism
Change-Id: Iba4ca4988146a71a01dcc6dbe911be5588bfe292
2025-11-21 07:58:24 +01:00
e8e5d2743a frappy_psi.ahcapbridge: fix behaviour when serial echo is on 2025-11-20 17:21:33 +01:00
77bda6a72f add frappy haake driver cfg
move haake sea configs to cfg/obsolete_sea_cfg
2025-11-20 11:33:51 +01:00
42ebe05d5b added an example config 2025-11-20 11:33:51 +01:00
765218eed2 frappy_psi.ahcapbridge: simplify
- remove the auto detect from replies
- improve readability
- add not implemented attributes in AHBase to avoid pylint
  complaints

Change-Id: I20aabe6c5cfaad94845cdfff22b889fb7ff7e257
2025-11-18 12:03:00 +01:00
f00d37b7a6 frappy.client.interactive: cosmetic fixes 2025-11-17 16:33:24 +01:00
3575921ac0 frappy_demo.test: add simple writable 2025-11-17 16:07:44 +01:00
f832e40898 add shortcut for acquisition modules
acq(<goal>) sets goal, starts and waits for completion
2025-11-17 16:06:07 +01:00
495ad01ff6 changes for leiden dil
- fixes on frappy_psiahcapbridge
- fixes on cfg files
- add cp1000 sea cfg files
2025-11-17 16:01:51 +01:00
e786c5ec77 frappy_psi.dilhtr: add Ctrlby wrapper
+ minor fix in tcs.py
2025-11-17 15:57:41 +01:00
a7b3f23bef frappy_psi.bridge: minor fixes
TODO: rename the file
2025-11-17 15:52:28 +01:00
151627b4f4 frappy.io: add readline method
For devices sending messages asynchronously, a simple
readline method is added. Waiting for characters is not
blocking writeline - only the actual reading is using
a lock.
This needs also some rework of frappy.lib.asynconn.
2025-11-17 15:48:45 +01:00
ee26c72ed4 add missing property check
check also values of properties with mandatory=False

Change-Id: I346691a7260a4d85b89c9620c097180da4e9d657
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37777
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-11-13 17:30:08 +01:00
9fe040e9d3 improve error handling during polls
improve the mechanism which avoids duplicated error messages
in the log file:

- extend to errors in doPoll
- trigger error messages every day, so that they appear in every
  logfile

+ add missing space in some error message

Change-Id: Icfaa06b43ee53f477483bab1f84def832fd0b977
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37432
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-11-13 17:29:58 +01:00
943995b1d7 improve error handling on startup
- configuration errors on startup are no longer collected in the
  'errors' attribute, but logged immediately and counted in a new
  'logError' method.
- generalConfig may be configured to raise the errors immediately
  instead
- Raise immediately on unhandled errors. Some of them were catched
  before which may lead to strange follow up errors.
- do not start poller thread, when the error count is non-zero
- as before, simple connection failures are not preventing startup,
  but now more severe errors (bad uri) will stop the server

Change-Id: I4f84ee8e86cf2925108c0fe92eaab796bb731091
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37776
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
2025-11-13 17:29:41 +01:00
8291976c5d frappy.modulebase: remove unneeded while loop
Change-Id: I76cf2d5323187972a1c8849f6b8dc98f99f21f90
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37699
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>
Reviewed-by: Georg Brandl <g.brandl@fz-juelich.de>
2025-11-13 15:38:33 +01:00
Georg Brandl
2ec2954159 datatypes: make length checks more consistent
Change-Id: If5a5422675571506085c73ff2051ba06f4fb37b2
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37844
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Reviewed-by: Georg Brandl <g.brandl@fz-juelich.de>
2025-11-13 15:35:39 +01:00
Georg Brandl
7769a5daa6 do not put entire blob value into error message, it might be megabytes
Change-Id: Ib94701022ea864b4d77d2ac632a8b6d74e8b2e16
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37842
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Reviewed-by: Georg Brandl <g.brandl@fz-juelich.de>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-11-13 15:30:35 +01:00
Georg Brandl
a31e5a5009 remove passive aggressiveness from error messages
Change-Id: I6a25703c65c11c1b57e2cad409b0da0bba724b5e
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37841
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>
2025-11-13 15:30:17 +01:00
Georg Brandl
cf220382b9 datatypes: do not arbitrarily restrict maxlen of arrays/blobs to 2**16
Change-Id: Ic03ff05240c7caa22ae5adf555f871d09612eecd
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37837
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Georg Brandl <g.brandl@fz-juelich.de>
2025-11-13 15:30:17 +01:00
Georg Brandl
66f0e64b2e client: increase read buffer size
Receiving large replies with 8kb buffer size is painfully slow.

Change-Id: Ife4a439d01153c60e8fd96d2c7f2874918fb4012
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37838
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Reviewed-by: Georg Brandl <g.brandl@fz-juelich.de>
2025-11-13 15:30:17 +01:00
6e10382d98 io: add reconnect command
sometimes reconnecting helps to heal a broken connection

Change-Id: I368ecb549ca346d7db3484f6a8be0a3a9a86aff1
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37433
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Georg Brandl <g.brandl@fz-juelich.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
2025-11-13 15:29:17 +01:00
Alexander Zaft
6600ec63fd module: apply datatype first
if the default value is given before the datatype, the module cannot be
created. Also fixes the remaining errors in issue 4913.

Fixes: 4913
Change-Id: I613576388bc3b9e7a5cdc7aa4d5ea73e549ae167
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37182
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>
2025-11-13 15:29:11 +01:00
Alexander Zaft
a62d85dc47 demo: add docstring to stop method of sampletemp
Change-Id: Ic575189eaf828d082a7ac382ad38141458c31522
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37183
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-11-13 15:29:05 +01:00
ef9b257a54 add config file to test function evaluator 2025-11-12 17:25:17 +01:00
af28f33018 frappy_psi.softcal: add function evaluator 2025-11-12 17:24:47 +01:00
a8b8fa1cc4 frappy_demo.test: add simple writable 2025-11-12 17:23:59 +01:00
17511b8bf2 frappy/lib: add math parser to evaluate a string function 2025-11-12 17:22:38 +01:00
308283412e frappy_psi.nanov: minor fixes
Change-Id: I0c6f1f09358155f49d4dedfe0c254dbe6b514b36
2025-11-05 16:37:42 +01:00
ebfb8a005d simplify errors on startup
Change-Id: I2b12abf15487000992e019e12002303036766d52
2025-11-05 16:23:46 +01:00
03c2f6eb98 frappy_psi.nanov: 'initial' version
- nneds some minor rework
2025-11-05 16:20:03 +01:00
e68ee356df frappy_psi.tcs: minor fixes 2025-11-05 15:53:45 +01:00
21c20c966c frappy_psi: add hcp 2025-11-05 15:53:45 +01:00
l_samenv
183f6dcec2 frappy_psi.muwaba: add meaning and units to cfg 2025-11-04 14:18:47 +01:00
71629c1d3a improvements when testing leiden
- triple current source
- software loop
2025-10-30 13:45:29 +01:00
b45635e4f8 make controlled_by configuration work properly
- secnode.py: initialize all modules before creating description
- fixes in ctrlby.py
2025-10-30 13:43:20 +01:00
2a4a37ed2f fixes for sea versions of ah2550 and ah2700 2025-10-30 13:43:20 +01:00
03ae83dbbc frappy_psi.ah2700: fixes 2025-10-30 13:43:20 +01:00
Alexander Zaft
07377c8bf5 core: Add Acquisition Interface
+ Adds first implementation for the Acquisition interface, split into
  Controller and Channel Modules
+ frappy_demo: adds an example simulation
+ new property AttachedDict for a collection of attached modules
+ move Attach and AttachDict to a new file frappy/attached.py
+ interface_classes creation changed. includes now also Acquisition

Change-Id: I198a96065a65bb28f73e468ce0465fca2d8734d7
2025-10-30 10:21:19 +01:00
84ee2dd508 specify interface_classes property explicitly on SECoP base classes
The mechanism to calculate the interface_classes automatically
gets more complicated whith the introduction if acquisition
classes. Instead of making the mechanism more complex its simpler
to give them explictly on the classes which correspond to the
predefined SECoP interface classes.

Change-Id: I9be7d9e54e3603b979ca2a823ec47b2075937ece
2025-10-30 10:21:05 +01:00
174da915d2 allow to remove a property defined in a base class
the same mechanism works already for parameters

Change-Id: I19da668ded9697b0f51069af9ddd752091abd0fc
2025-10-30 10:20:21 +01:00
24153d2584 datatypes: split base classes for internal and SECoP datatypes
Simple datatypes used only in properties like ValueType of NoneOr
do not need a couple of methods. Splitting the base class avoids
warnings about unimlemented abstract methods.

Change-Id: Ie7d5754c44a5fb5c3ed8569df544495450347082
2025-10-30 10:19:49 +01:00
8575a2f785 improve error messages when attached modules fail on startup
fix to align local frappy branch wip with gerrit repo

Change-Id: Iafbd8c5e4b67209046c252f2cafa69dcb6e2bbcb
2025-10-30 08:01:26 +01:00
51725d6d0d fix bug introduced in commit 7adb4d6f
Change-Id: I00f0101a437ec070a8a3f07b3c0766acde23cad4
2025-10-29 16:58:58 +01:00
08f9416de5 add dilhtr 2025-10-29 16:44:46 +01:00
7adb4d6f04 improve error messages when attached modules fail on startup
Change-Id: Ic1d2d77de2574043749ddbc00def48a6fe77b2bd
2025-10-27 13:14:26 +01:00
ea5fc16a51 frappy_psi.ls370res: add TemperatureChannel
Change-Id: I5a0fd6a1352f08583393862718f59ee5fb6eee32
2025-10-27 13:10:31 +01:00
542079c876 fs: fix renamed relais - must be relay
Change-Id: I13140ea094f58335cb34f4431810ae642b74e87a
2025-10-27 13:09:39 +01:00
160c3bfaf9 frappy_psi.furnace: small improvments
- got not ail when _interlock is None

Change-Id: Ic56bf7b7beeabc39bb8ced3388c7d0f14845463a
2025-10-27 11:59:42 +01:00
576723c650 frappy_psi.picontrol: add PIctrl
Change-Id: If212712b691ecabec1ff70d7040eb4e23924c01e
2025-10-27 11:59:00 +01:00
65e27e0913 add muwaba multiple water bath 2025-10-23 10:49:26 +02:00
82663a142e frapp_psi.iomopinmax: digital output and SimpleVoltageInput
- read back value in DigitalOutput.write_target
- correct scale factor in SimpleVoltageInput
2025-10-23 10:49:26 +02:00
Anik Stark
cda6e08d6c frappy_psi: added channels 2025-10-21 16:27:55 +02:00
Anik Stark
fed7ce2197 frappy_psi: fix write_on in tcs 2025-10-21 16:24:16 +02:00
Anik Stark
cb142c580d frappy_psi: add triple current source (leiden) 2025-10-21 15:41:40 +02:00
53497df207 ma11: fix bug in cfg/sea/ma11.config.json 2025-09-24 10:22:25 +02:00
866cb7569c add mspare stick 2025-08-29 11:26:39 +02:00
e327bb0974 frappy_psi.thermofisher: fix bug reading limits
+ add proper description into cfg file
2025-08-26 11:16:34 +02:00
08244e17e0 frappy_psi.thermofisher: add limits
also switch off control when T is outside limits by more than
security_margin

Change-Id: I3df513c7bc36ca23bf249c61fdfadb39870db3a5
2025-08-25 09:30:29 +02:00
431f4d1198 fi furnace: version for first tests
Change-Id: I841bc9dab210bfc907d2ae56c42198c30df9a3a4
2025-08-07 15:57:12 +02:00
bea6ea38ae interactive client: change command history location
- place file in ~/.local/state/
- create the directory if needed
- use pathlib

Change-Id: I9381c65fd63cea44013f2cfd16e14b8dc26c465c
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/37111
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
2025-08-07 14:01:33 +02:00
Georg Brandl
8ba9f91f8a demo sample temp: allow stopping
Change-Id: I74ddb8d8c7919e0123431de3833d7f7a4a3c22bd
2025-08-07 13:38:57 +02:00
Jenkins system
52def86ac8 [deb] Release v0.20.7 2025-08-07 13:38:57 +02:00
Georg Brandl
c54ab5b9dd fix debian install
Change-Id: Ibb5e76f84b990a431769c9bfce9d9892009a323a
2025-08-07 13:38:57 +02:00
Jenkins system
30e7e52524 [deb] Release v0.20.6 2025-08-07 13:38:57 +02:00
Georg Brandl
cbf387ed87 install systemd units to /usr/lib
Change-Id: I3c7cbeda67f84008a29ae9f77f4086aaf3143090
2025-08-07 13:38:57 +02:00
96ef11ef84 haake: add a native frappy addon haake_add
+ add units to haake2
2025-07-11 14:52:45 +02:00
1128b5aba4 in dilution dump_targetpressure default changed to 50 2025-07-11 08:53:43 +02:00
l_samenv
cd3fdb6b62 ionopimax: add SimpleVoltageInput for iono pi
+ add thermofischer cfg (better name needed)
2025-07-10 11:20:22 +02:00
cdc2748818 dil5: reorder modules in cfg 2025-07-10 10:15:40 +02:00
eab846d28e frappy_psi.ls372: add 0 to the filter enum 2025-07-10 10:15:09 +02:00
db0ea2cc34 eurotherm_cfg: remove duplicate meaning
Change-Id: I9836b369ca7e268cc5aeb53a85a5690705c197d8
2025-07-08 11:33:27 +02:00
49c4edaa88 cfg: remove ori7test and fix sim_mlz_ccr12_v2
Change-Id: Iab40fe35b3a035c6957be6e45624b33c8f572311
2025-07-08 11:33:27 +02:00
337b91b799 bin/frappy-scan: add path for in-place usage 2025-07-08 09:07:42 +02:00
7814d054b9 mb11_cfg: remove sea_cfg from 2025-07-07 16:28:10 +02:00
8dc2677158 MA7 Stick heater loop fixed 2025-07-07 16:26:39 +02:00
cf151dd324 fs (and other furnaces): fixes on interlock
- try to make interlock right
- merge status where ever possbile
2025-07-07 16:05:27 +02:00
1e73440149 AnalogInput: write mode only when needed
- this does probably influence the input channel for some short time
+ issue a warning when read value is -1. this may indicate an error!
2025-07-07 16:03:45 +02:00
03dfb6aeb0 Merge branch 'wip' of https://gitea.psi.ch/linse/frappy into wip 2025-07-04 14:33:03 +02:00
73c620797c frappy.ctrlby: improvements
Change-Id: I7ea2d0398fa3b32002dbaa066e3923fef72535fa
2025-07-02 15:41:41 +02:00
abf5f21e16 SEA ah2700.addon: fix name 'bufperiod' 2025-07-02 11:27:55 +02:00
c7496fa21f SEA dil*.stick: add off=0 to the list of heater ranges 2025-07-02 11:27:25 +02:00
926dcd09e2 frappy_psi.sea: use secnode.name to determine the service
this fix is only needed in case uri is not given
2025-07-02 11:25:12 +02:00
83f40f0c33 fs: make 'sensor broken' message active
- for this use frappy_psi.PRtransmitter instead
  of ionopimax.CurrentInput
- add disabled_checks parameter
2025-06-30 18:09:07 +02:00
57b245c5ac fs: make 'sensor broken' message active
- for this use frappy_psi.PRtransmitter instead
  of ionopimax.CurrentInput
- add disabled_checks parameter
2025-06-30 18:01:55 +02:00
a5a4212691 DIL5: changed interface on ITC and LS372 2025-06-27 16:10:33 +02:00
a3d0549199 fs: improve and fix implementation
+ introduce WrapControlledBy and fix HasControlledBy

this in a new module before mercury/triton have been fixed
2025-06-27 14:48:02 +02:00
8385461163 softcal: change name of param 'calib' to 'calcurve'
make it more consistent

Change-Id: I8d8f62190c07179de25c893bfcdf11300010cd78
2025-06-24 10:50:29 +02:00
1a70099974 sea: fix problem with LscDrivable.read_value 2025-06-17 10:23:43 +02:00
c2b97a8dac SEA: change all sea min config to LscDrivable
Change-Id: If9828186377c78d8534d798cc59ce3a676f66222
2025-06-10 17:01:12 +02:00
27778e80f5 SEA: let tt.value be the sample temperature when dblctrl is on
for this tt has to be a frappy_psi.sea.LscDrivable

Change-Id: Ic452b39237d31a7765bc8b2f22a12c2f454fe7da
2025-06-10 16:50:49 +02:00
6c74c957a8 MB11: fix sample stick cfg
- remove mb11std
2025-06-10 12:31:35 +02:00
eecbe9ca6b MA6: fix bad sea config 2025-06-06 12:17:05 +02:00
385480a8cc SEA: again fixing paramFilter 2025-06-06 12:15:48 +02:00
c92cb22d97 dil5: updated cfg to match class 2025-06-05 17:49:02 +02:00
d85d80ba36 dil5: working alfa version
Change-Id: Ib6bf2234633cc760fc771a3f5c0beb4cb63a0f6d
2025-06-05 17:48:15 +02:00
2b7ee0a72c addressed parameters
- generic method to access parameters with just an address
  changed to avoid boilerplate code
- it would really be nice to include the generic methods
  into Module

Change-Id: I898e5eeb282f03d3177a324fa88813976fb15f3c
2025-06-05 17:48:15 +02:00
97140aa3b4 SEA: do not override write_target method
else it will not wait for is_running

+ fix in playground
2025-06-05 11:52:50 +02:00
1ad699fb66 jtccr cfg: missing tolerance and settle (need '.' in rel_paths) 2025-06-05 11:52:50 +02:00
52f90fe5be frappy_psi.manual_valves: make persistent and clean up
Change-Id: Ifbdc886f556064745a7aaffbfdc1bad2ad74632e
2025-06-05 10:22:36 +02:00
404b38d91a frappy.params: fix typo
Change-Id: I724615de8d8d6b44bc5aceded85bf40d2a5e96f7
2025-06-05 10:22:07 +02:00
3203c6c9b3 [WIP] clean dil5 configuration 2025-06-05 10:20:54 +02:00
472ae3f04d [WIP] dil5 improvements
Change-Id: I2b439bf5898601e10448511479bc67afa3edb4d3
2025-06-05 10:16:47 +02:00
04f7f6ece5 bin/frappy-cli: fix hosts variable 2025-06-05 10:16:42 +02:00
54c9fb9db9 SEA: again a fix - commits before damaged 'mf' of MA10 2025-06-03 11:43:43 +02:00
c0f6569f1b frappy-cli: connect to servers on localhost by default
--scan option: specify where to scan if not on localhost

Change-Id: I51a694eb3cb045e7d18c19a332db8e6ba063009b
2025-06-02 15:24:04 +02:00
745e15c709 SEA: another fix: make sure the value parameter comes first 2025-06-02 11:01:12 +02:00
62adec4874 jtccr: the main subpath in sea is names 'main', not 'tt' 2025-06-02 09:17:48 +02:00
9131bdab51 SEA: fix lost parameter on top level 2025-06-02 09:01:13 +02:00
a0629db53d SEA: fix missing parameters at top level 2025-05-30 10:45:56 +02:00
415acb42cf frappy.client.SecopClient: fix setParameterFromString
add missing datatype.export_value

Change-Id: I824d922fdda1ab548e4625982e1485ec4b758cb9
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36172
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>
2025-05-27 15:54:27 +02:00
ee67a135e9 frappy_psi.sea: bugfix: revert change of updateEvent to udpateItem
revert some of change 34813
SeaClient is based on ProxyClient, not SecopClient
-> updateItem is not defined there

Change-Id: Ib3049038481917ec7a11b9fb2d285cedff5febbb
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/34873
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-05-27 15:54:27 +02:00
ef826297fd frappy_psi.sea: bugfix: revert change of updateEvent to udpateItem
revert some of change 34813
SeaClient is based on ProxyClient, not SecopClient
-> updateItem is not defined there

Change-Id: Ib3049038481917ec7a11b9fb2d285cedff5febbb
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/34873
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-05-27 15:54:27 +02:00
50118e4ead haake: fix haake2 and add pumprunning 2025-05-27 15:51:54 +02:00
f9880f1473 frappy-psi.logo: fix IO.communicate reply 2025-05-27 15:41:33 +02:00
0dd13d7ef9 dil5/logo: fix valve addresses 2025-05-23 14:54:54 +02:00
6aec38d03e frappy_psi.logo: add comLog
+ fix bug in frappy_psi/dilution_statemachine.py
2025-05-23 10:31:51 +02:00
2238c20a37 DIL5: improve states in the state machine 2025-05-22 15:11:21 +02:00
018ed920b9 use longer, unique uris for USB serial connections 2025-05-22 15:10:38 +02:00
14f61b01db frappy_psi.pfeiffer_new: calculate crc in PfeifferProtocol 2025-05-22 15:08:41 +02:00
6fed5a3651 increase omit_unchanged_within to 60 s
+ fix a bug reading this from general config file
2025-05-22 08:38:51 +02:00
f3c7cdc7c4 frappy.client.SecopClient: fix setParameterFromString
add missing datatype.export_value

Change-Id: I824d922fdda1ab548e4625982e1485ec4b758cb9
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36172
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>
2025-05-22 08:38:51 +02:00
4f3ebf0aaf frappy_psi.sea: bugfix: revert change of updateEvent to udpateItem
revert some of change 34813
SeaClient is based on ProxyClient, not SecopClient
-> updateItem is not defined there

Change-Id: Ib3049038481917ec7a11b9fb2d285cedff5febbb
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/34873
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-05-22 08:38:51 +02:00
85f14ace40 add units to jtccr 2025-05-22 08:38:51 +02:00
bc1ba4abb9 haake: make 2 versions depending on extra T sensor 2025-05-22 08:38:51 +02:00
cf50a372b3 varioxb: uncomment motor setup with triple quote 2025-05-22 08:38:51 +02:00
67ea5340ee ori4: revert removing '.' from rel_path
not sure if this is correct
2025-05-22 08:38:51 +02:00
7d6ac4d742 dil2/3/4: make He3 pump visible 2025-05-22 08:38:51 +02:00
a76e529a82 frappy_psi.phytron: improve clear_errors message 2025-05-22 08:38:51 +02:00
7dfe2925aa frappy_psi.sea: bugfix: revert change of updateEvent to udpateItem
revert some of change 34813
SeaClient is based on ProxyClient, not SecopClient
-> updateItem is not defined there

Change-Id: Ib3049038481917ec7a11b9fb2d285cedff5febbb
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/34873
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-05-22 08:38:51 +02:00
a6c86a5fe7 [WIP] further work on CCU4
Change-Id: Icdd6e253f276a5ade44fb4103306160fc348556b
2025-05-16 16:20:59 +02:00
d3280474c3 frappy.client.interactive: no pathlib needed here
allow the argument of the run function to be a simple string

Change-Id: I1d5de3802b6adc22a01a262d4cb017bf7dd084c5
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36343
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-05-16 15:43:00 +02:00
7cf32c4e7c config: add 'include' and 'override'
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>
2025-05-16 15:43:00 +02:00
Jenkins system
48b79af96a [deb] Release v0.20.5 2025-05-16 15:43:00 +02:00
b1c920819e frappy.client.interactive: improve updates while driving
- 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>
2025-05-12 10:48:14 +02:00
8f2973c39d client: add SecopClient.execCommandFromString
analogous to setParameterFromString
to be used in simple clients where values of structured datatypes
are just python literals

Change-Id: I4936a3c5c0cac45bd7e875c938ce2700b4f4a979
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36262
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-05-12 10:46:39 +02:00
6343edc3cb frappy_psi/ls370res: various bug fixes
- avoid some error messages on disabled channels
- update value of channel switcher properly
- fix bug in set_param method

Change-Id: I16f5cf2d7abce0c0fae17266f0c8e949e8416b7a
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36263
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-05-12 10:45:04 +02:00
bd00758460 frappy.client.SecopClient: fix setParameterFromString
add missing datatype.export_value

Change-Id: I824d922fdda1ab548e4625982e1485ec4b758cb9
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36172
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>
2025-05-12 10:44:47 +02:00
Konstantin Kholostov
d2cce8f21c installer: add recipe to build macOS app bundle
Change-Id: Ief4401626db293fecc37f1d1ec72cf295b55fccf
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36060
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Alexander Zaft <a.zaft@fz-juelich.de>
2025-05-12 10:41:59 +02:00
f6a5ef8f4d Add DIL5 Statemachine and LOGO 2025-05-09 10:35:11 +02:00
dad9536eb5 [WIP] fi furnace improvements
- still under development

Change-Id: I5fc22f041fb136b549016f510f06ea703122bee5
2025-05-08 08:29:45 +02:00
ccc66468d4 change prot for dummy to 5000
Change-Id: If35bbe6783fe133c0c6c87f402ba70aec00fa964
2025-05-01 11:43:49 +02:00
52215f9ec1 dummy_cfg.py: add test case with big enum
+ fix undefined value in frappy_psi.ls370res.Switcher

Change-Id: I59f2814b945533c487999f9af638e0fb2040e862
2025-05-01 08:52:30 +02:00
58549065fb more demo test cases
- added them to cfg/dummy_cfg.py
+ treat enum correctly in SecopClient.setParameterFromString

Change-Id: Ia5b2d8d3a21c3215cb93d90975086eb9995b1543
2025-04-25 15:38:16 +02:00
0230641b1d logdif.py: use single key to stop or continue
Change-Id: I53b3254074eda7491dd16bbc39168960b0980e39
2025-04-24 11:24:46 +02:00
b264455ad3 follow-up change to 35931: make Proxy a Module
Proxy must be a class, because of the new check for configured
'cls' inheriting from Module. Use Proxy.__new__ to implement
this.

Change-Id: I4bb036afc2ce92187a9049dff0a6f22b20c3a260
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36104
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
2025-04-24 11:14:35 +02:00
07c5b32c5f revert 'change to new visibility spec'
nicos is not yet ready for this

Change-Id: Ibfbb7e32e06a6e0616ded8342bc5844fd531944f
2025-04-24 11:09:26 +02:00
PREVENT_DEFAULT
80cb3f08d7 add sr830 addons cfg 2025-04-24 10:50:09 +02:00
fb4755502b frappy_psi.parmod: extract a tuple element as own moudle
Change-Id: I8d904ed21f8a5c16ae71daf30c9a1ea42876b451
2025-04-24 10:48:35 +02:00
3580cb9dc0 frappy_psi.ionopimax.AnalogInput: set value range on datainfo
Change-Id: I1e3da956e829f69a0af416b7beadb81bd6bc0cb1
2025-04-23 08:37:55 +02:00
d681507f94 frappy_psi.furnace: special classes PTXgauge and PRtransmitter
move some initialization from cfg file to source code
+ make 'out of calibrated range' and 'sensor break' more generic

Change-Id: I3e92100fdb9c983f82665de9d8e063609cd7af5a
2025-04-23 08:28:08 +02:00
e0bd84cc3b change to new visibility spec
+ visibiliy is no longer an EnumType, as this would break
  the specs

Change-Id: I1197c82f31c33c210fdcda0b49a0c38027880d77
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36088
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>
2025-04-23 08:20:54 +02:00
9545cb4188 make sure unexported modules are initialized
take the opportunity for a small redesign:

- create a new method build_descriptive_data which
  calls secnode.get_modules also on unexported modules.

+ cache descriptive data

Change-Id: I4a0b8ac96108463dc0c800bb11a404206c26b092
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/36089
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>
2025-04-23 08:20:54 +02:00
1fead8b2c6 better dummy server for seaweb tests
- new config file dummy
- frappy_demo.test.Temp now creates WARN and ERROR status
  and may be disabled

Change-Id: Ibc7bb565f18c2c12cdc2a77bea1ee1bf1cc8bd41
2025-04-22 18:06:23 +02:00
809eda314b ionopimax: bug fixes 2025-04-15 10:57:02 +02:00
ca6fd1dd5e frappy_psi.ionopimax redesign
Change-Id: I46b62522c24ad9f0352ba7a784d39ffd1cb79ef3
2025-04-15 09:00:30 +02:00
d0c063c60b [WIP] further fixes for linse-fi 2025-04-14 17:26:26 +02:00
7a59cf4956 frappy-play: fix import order 2025-04-14 17:20:12 +02:00
7254d7f95c [WIP] fixes for linse-fi
Change-Id: Iac28e9654a764331cd903896879834cd6127a919
2025-04-14 11:46:02 +02:00
c368292873 fixes on picontrol and tdkpower
Change-Id: Ia891e7df23d8408b857dac795ed0ad9973ccf993
2025-04-08 17:15:17 +02:00
6a2aece383 fixes on small furnace 2025-04-08 17:12:44 +02:00
ad76a5d752 add fi_cfg.py (ILL furnace)
Change-Id: I8720dbeb3f29b07eaeae59558c58b2fa87096dc9
2025-04-08 15:22:35 +02:00
42e40db14b WIP frappy_psi/tdkpower
Change-Id: I80d1beb0fae2a1cdd2aa5fabc5d31c651c2cb3e7
2025-04-08 08:32:26 +02:00
343ce90321 peus-plot: optionally give x-range as 2nd argument
Change-Id: I445ef00487fc34343f5a0333643f61753a1c4948
2025-04-02 14:56:47 +02:00
75783b211a ultrasound.ControlRoi: fix control mechanism
Change-Id: I9d01de260d3bdc63eb1004ba4f714d38d1c0508c
2025-04-02 14:56:47 +02:00
l_samenv
36f2919ec2 cfg/ls370test update 2025-04-01 09:56:39 +02:00
7cca3192df improve error messages on module creation
- add name when target and value datatype are incompatible
- check that module class inherits from Module

Change-Id: I4edbdff1c250b64b74b1adf7287f9659dff69b26
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/35931
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
2025-04-01 09:55:44 +02:00
a632c53405 fix overriding Parameter with value
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>
2025-04-01 09:55:44 +02:00
a76425cb2e ultrasound.PE: fix control loop
Change-Id: I2b2bdf4ad48887ae256a68119f53e6a38048ce1e
2025-04-01 09:54:18 +02:00
d231e9ce06 [WIP] ccracks / ccu4: split ccu() into nv(), he() and flow()
Change-Id: I346330a5f350bf03eefe86c8e890b59afaaaa231
2025-03-31 17:30:29 +02:00
44750572d9 Merge branch 'wip' of gitlab.psi.ch:samenv/frappy into wip 2025-03-31 17:26:02 +02:00
e0ef6047e2 ultrasound.PulseEcho: fix issue with roi intervals
now it should be time +- 0.5 * size
2025-03-31 17:25:53 +02:00
421eb67b93 Merge branch 'glab_merge_request' into 'wip'
frappy_psi.sensirion: fix a typo

See merge request samenv/frappy!1
2025-03-28 16:47:39 +01:00
3048b8cb7d frappy_psi.sensirion: fix a typo
Change-Id: I259151b7a1b908c8289ecb88d2d3d4e6d9e45c12
2025-03-28 16:30:10 +01:00
0ef484e082 frappy_psi/adq_mr (ultrasound): exit on reboot error message
otherwise the error message is confusing
+ remove CR from line endings in adq_mr.py

Change-Id: Ia465a26803a92677383969ff620ef35e58f1a5ec
2025-03-28 14:27:06 +01:00
8560384529 ls370res: do not raise in read_rdgrng error when channel is disabled
Change-Id: I565e5cd74cf7f12bfd5eea9e8867117154461017
2025-03-28 14:27:06 +01:00
l_samenv
16d419c0f3 ah2700: make loss its own module 2025-03-28 13:15:24 +01:00
Ultrasound PC
8c548da2e0 bin/us-plot: fix usage message 2025-03-26 17:02:35 +01:00
Ultrasound PC
d9f340dce6 ultrasound: change control roi0 to a Readable (2)
+ remove cfg/PEUS.py
+ fix equipment_id of PEUS
+ add header to frappy_psi.iqplot
2025-03-26 16:45:53 +01:00
Ultrasound PC
1325c8924d ultrasound: change control roi0 to a Readable
+ remove cfg/PEUS.py
+ fix equipment_id of PEUS
2025-03-26 16:37:15 +01:00
Ultrasound PC
f8e3bd9ad2 improve ultrasound plot clients
- make plot window not to raise to the front on replot
- chmod +x
2025-03-26 16:18:54 +01:00
6f547f0781 ultrasound: reworked after tests
- new classes in frappy_psi/ultrasound.py and frappy_psi/adq.mr.py
- add signal plottter
- move clients to bin/ directory

Change-Id: I8db8e5ebc082c346278f09e0e54504e070655f14
2025-03-26 15:31:46 +01:00
l_samenv
322cd39e0a gas10k / mercury.HeaterUpdate: switch off loop on startup
the class frappy_psi.mercury.HeaterUpdate is used for the output
of a soft pid loop. set target to 0 to switch off the loop
on startup.
2025-03-26 10:51:16 +01:00
l_samenv
41b51b35fd further work on needle valve, pump and lakeshore 2025-03-19 16:38:21 +01:00
19571ab83d change again how to exit logdif.py
Change-Id: I442ca8c2ee7ca25ff98a0e84df2688a55a0dcec9
2025-03-19 16:34:59 +01:00
b35c97f311 stop poller threads on shutdown: cosmetics
cosmetics after gerrit

Change-Id: I4d982f83e3fe5a8c8c821ac718e51b9a58de2a62
2025-03-19 15:33:25 +01:00
5d175b89ca frappy_psi.ultrasound: add input_delay and other improvments
Change-Id: I6cb5690d82d96d6775fcb649fc633c4039932463
2025-03-19 15:29:17 +01:00
f8c52af3ac frappy_psi.ultrasound: after rework (still wip)
Change-Id: I200cbeca2dd0f030a01a78ba4d38c342c3c8c8e3
2025-03-17 09:37:13 +01:00
bf9c946b1d frappy-scan: resolve ip numbers to names
Change-Id: I07bf7c274aeb52f2aaa58e8aa2f3bcb2788556ee
2025-03-17 09:36:50 +01:00
09e596f847 stop poller threads on shutdown
make sure module methods are not called after shutdownModule

+ fix: when mod.enablePoll is False, pollInfo is None
  therefore we have to check before access

Change-Id: I83b28607b25996376939175be8abf0c5b27bcac1
2025-03-17 09:35:57 +01:00
l_samenv
7e2ccd214e frappy_psi.drums: changes after test
when trying with Marcel, we needed these fixes
2025-03-14 09:05:09 +01:00
907a52ccdb config: Mod() should return config dict
this helps for coded configuration

Change-Id: I07bdf72f77082f31ee86192faec63df706dcbf56
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/35803
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Georg Brandl <g.brandl@fz-juelich.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
2025-03-07 10:19:46 +01:00
51dba895a5 config: validate value and default of parameters
The Parameter Properties 'value', 'default' and 'constant'
have ValueType, so they are not checked in the setProperty call.
We have to do this explicitly in Module._add_accessible.

Change-Id: I1e35adf2fe539411b4aebacd813adb07497de95b
Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/35797
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>
2025-03-07 10:19:01 +01:00
Georg Brandl
d86718b81e remove wrong <weight> from fonts on Qt6
Change-Id: Ib94b2ed74598b9f54c2361e61bfa940e60bd7c62
2025-03-07 10:18:51 +01:00
Georg Brandl
42a6bfb5d2 debian: update compat
Change-Id: I172dff4e0239ce90fe7b1c19fc800ba98f116270
2025-03-07 10:18:42 +01:00
895f66f713 core: simplify test for methods names
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>
2025-03-07 10:18:35 +01:00
3663c62b46 core: alternative approach for optional accessibles
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>
2025-03-07 10:18:27 +01:00
l_samenv
8c2588a5ed merged changes for lakeshore and ccu4 2025-03-07 07:37:11 +01:00
174 changed files with 11316 additions and 2693 deletions

View File

@@ -24,12 +24,14 @@
import sys import sys
import argparse import argparse
import socket
from pathlib import Path from pathlib import Path
# Add import path for inplace usage # Add import path for inplace usage
sys.path.insert(0, str(Path(__file__).absolute().parents[1])) sys.path.insert(0, str(Path(__file__).absolute().parents[1]))
from frappy.client.interactive import init, run, clientenv, interact from frappy.client.interactive import init, run, clientenv, interact
from frappy.protocol.discovery import scan
def parseArgv(argv): def parseArgv(argv):
@@ -37,6 +39,9 @@ def parseArgv(argv):
parser.add_argument('-i', '--include', parser.add_argument('-i', '--include',
help='file to execute after connecting to the clients', metavar='file', help='file to execute after connecting to the clients', metavar='file',
type=Path, action='append', default=[]) type=Path, action='append', default=[])
parser.add_argument('-s', '--scan',
help='hosts to scan for (-s subnet for all nodes in subnet)',
action='append', default=[])
parser.add_argument('-o', '--only-execute', parser.add_argument('-o', '--only-execute',
help='Do not go into interactive mode after executing files. \ help='Do not go into interactive mode after executing files. \
Has no effect without --include.', action='store_true') Has no effect without --include.', action='store_true')
@@ -46,9 +51,38 @@ def parseArgv(argv):
return parser.parse_args(argv) return parser.parse_args(argv)
def own_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(0)
try:
# doesn't even have to be reachable
s.connect(('10.254.254.254', 1))
return s.getsockname()[0]
except Exception:
return '127.0.0.1'
finally:
s.close()
args = parseArgv(sys.argv[1:]) args = parseArgv(sys.argv[1:])
success = init(*args.node) nodes = args.node
hosts = args.scan
if not nodes and not hosts:
hosts = ['localhost']
if hosts:
answers = []
for host in hosts:
ans = scan()
if host == 'subnet': # all in subnet
answers.extend(ans)
else: # filter by ip
ip = socket.gethostbyname(host)
if ip == '127.0.0.1':
ip = own_ip()
answers.extend(a for a in ans if a.address == ip)
nodes.extend(f'{h.hostname}:{h.port}' for h in answers)
success = init(*nodes)
run_error = '' run_error = ''
file_success = False file_success = False

View File

@@ -23,12 +23,12 @@
import sys import sys
from pathlib import Path from pathlib import Path
from frappy.lib import generalConfig
from frappy.logging import logger
# Add import path for inplace usage # Add import path for inplace usage
sys.path.insert(0, str(Path(__file__).absolute().parents[1])) sys.path.insert(0, str(Path(__file__).absolute().parents[1]))
from frappy.lib import generalConfig
from frappy.logging import logger
from frappy.client.interactive import Console from frappy.client.interactive import Console
from frappy.playground import play, USAGE from frappy.playground import play, USAGE

View File

@@ -23,106 +23,39 @@
"""SEC node autodiscovery tool.""" """SEC node autodiscovery tool."""
import argparse import argparse
import json
import os
import select
import socket
import sys import sys
from collections import namedtuple from pathlib import Path
from time import time as currenttime # Add import path for inplace usage
sys.path.append(str(Path(__file__).absolute().parents[1]))
UDP_PORT = 10767 from frappy.protocol.discovery import scan, listen
Answer = namedtuple('Answer',
'address, port, equipment_id, firmware, description')
def decode(msg, addr):
msg = msg.decode('utf-8')
try:
data = json.loads(msg)
except Exception:
return None
if not isinstance(data, dict):
return None
if data.get('SECoP') != 'node':
return None
try:
eq_id = data['equipment_id']
fw = data['firmware']
desc = data['description']
port = data['port']
except KeyError:
return None
addr, _scanport = addr
return Answer(addr, port, eq_id, fw, desc)
def print_answer(answer, *, short=False): def print_answer(answer, *, short=False):
if short: if short:
# NOTE: keep this easily parseable! # NOTE: keep this easily parseable!
print(f'{answer.equipment_id} {answer.address}:{answer.port}') print(f'{answer.equipment_id} {answer.hostname}:{answer.port}')
return return
print(f'Found {answer.equipment_id} at {answer.address}:') numeric = f' ({answer.address})' if answer.address == answer.hostname else ''
print(f'Found {answer.equipment_id} at {answer.hostname}{numeric}:')
print(f' Port: {answer.port}') print(f' Port: {answer.port}')
print(f' Firmware: {answer.firmware}') print(f' Firmware: {answer.firmware}')
desc = answer.description.replace('\n', '\n ') desc = answer.description.replace('\n', '\n ')
print(f' Node description: {desc}') print(f' Node description: {desc}')
print() print('-' * 80)
def scan(max_wait=1.0):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# send a general broadcast
try:
s.sendto(json.dumps(dict(SECoP='discover')).encode('utf-8'),
('255.255.255.255', UDP_PORT))
except OSError as e:
print('could not send the broadcast:', e)
# we still keep listening for self-announcements
start = currenttime()
seen = set()
while currenttime() < start + max_wait:
res = select.select([s], [], [], 0.1)
if res[0]:
try:
msg, addr = s.recvfrom(1024)
except socket.error: # pragma: no cover
continue
answer = decode(msg, addr)
if answer is None:
continue
if (answer.address, answer.equipment_id, answer.port) in seen:
continue
seen.add((answer.address, answer.equipment_id, answer.port))
yield answer
def listen(*, short=False):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
if os.name == 'nt':
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
else:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
s.bind(('0.0.0.0', UDP_PORT))
while True:
try:
msg, addr = s.recvfrom(1024)
except KeyboardInterrupt:
break
answer = decode(msg, addr)
if answer:
print_answer(answer, short=short)
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('-l', '--listen', action='store_true', parser.add_argument('-l', '--listen', action='store_true',
help='Print short info. ' help='Keep listening after the broadcast.')
'Keep listening after the broadcast.') parser.add_argument('-s', '--short', action='store_true',
help='Print short info (always on when listen).')
args = parser.parse_args(sys.argv[1:]) args = parser.parse_args(sys.argv[1:])
short = args.listen or args.short
if not short:
print('-' * 80)
for answer in scan(): for answer in scan():
print_answer(answer, short=args.listen) print_answer(answer, short=short)
if args.listen: if args.listen:
listen(short=args.listen) for answer in listen():
print_answer(short=short)

53
bin/peus-plot Executable file
View File

@@ -0,0 +1,53 @@
#!/usr/bin/env python3
import sys
from pathlib import Path
# Add import path for inplace usage
sys.path.insert(0, str(Path(__file__).absolute().parents[1]))
from frappy.client.interactive import Client
from frappy_psi.iqplot import Plot
import numpy as np
import matplotlib.pyplot as plt
if len(sys.argv) < 2:
print('Usage: peus-plot <maxY>')
def get_modules(name):
return list(filter(None, (globals().get(name % i) for i in range(10))))
secnode = Client('pc13252:5000')
time_size = {'time', 'size'}
int_mods = [u] + get_modules('roi%d')
t_rois = get_modules('roi%d')
i_rois = get_modules('roi%di')
q_rois = get_modules('roi%dq')
maxx = None
if len(sys.argv) > 1:
maxy = float(sys.argv[1])
if len(sys.argv) > 2:
maxx = float(sys.argv[2])
else:
maxy = 0.02
iqplot = Plot(maxy, maxx)
for i in range(99):
pass
try:
while True:
curves = np.array(u.get_curves())
iqplot.plot(curves,
rois=[(r.time - r.size * 0.5, r.time + r.size * 0.5) for r in int_mods],
average=([r.time for r in t_rois],
[r.value for r in i_rois],
[r.value for r in q_rois]))
if not iqplot.pause(0.5):
break
except KeyboardInterrupt:
iqplot.close()

65
bin/us-plot Executable file
View File

@@ -0,0 +1,65 @@
#!/usr/bin/env python3
import sys
from pathlib import Path
# Add import path for inplace usage
sys.path.insert(0, str(Path(__file__).absolute().parents[1]))
from frappy.client.interactive import Client
import numpy as np
import matplotlib.pyplot as plt
from frappy_psi.iqplot import Pause
if len(sys.argv) < 2:
print("""
Usage:
us-plot <end> [<start> [<npoints>]]
end: end of window [ns]
start: start of window [n2], default: 0
npoints: number fo points (default 1000)
""")
sys.exit(0)
Client('pc13252:5000')
def plot(array, ax, style, xs):
xaxis = np.arange(len(array)) * xs
return ax.plot(xaxis, array, style)[0]
def update(array, line, xs):
xaxis = np.arange(len(array)) * xs
line.set_data(np.array([xaxis, array]))
def on_close(event):
sys.exit(0)
start = 0
end = float(sys.argv[1])
npoints = 1000
if len(sys.argv) > 2:
start = float(sys.argv[2])
if len(sys.argv) > 3:
npoints = float(sys.argv[3])
fig, ax = plt.subplots(figsize=(15,3))
pause = Pause(fig)
try:
get_signal = iq.get_signal
print('plotting RUS signal')
except NameError:
get_signal = u.get_signal
print('plotting PE signal')
xs, signal = get_signal(start, end, npoints)
lines = [plot(s, ax, '-', xs) for s in signal]
while pause(0.5):
plt.draw()
xs, signal = get_signal(start, end, npoints)
for line, sig in zip(lines, signal):
update(sig, line, xs)

View File

@@ -1,67 +0,0 @@
Node(equipment_id = 'pe_ultrasound.psi.ch',
description = 'pulse echo ultra sound setup',
interface = 'tcp://5000',
)
Mod('f',
cls = 'frappy_psi.ultrasound.Frequency',
description = 'ultrasound frequency and acquisition loop',
uri = 'serial:///dev/ttyS1',
pars = 'pars',
pollinterval = 0.1,
time = 900, # start time
size = 5000,
freq = 1.17568e+06,
basefreq = 4.14902e+07,
control = False,
rusmode = False,
amp = 5.0,
nr = 1000, #500 #300 #100 #50 #30 #10 #5 #3 #1 #1000 #500 #300 #100 #50 #30 #10 #5 #3 #1 #500
sr = 32768, #16384
plot = True,
maxstep = 100000,
bw = 10E6, #butter worth filter bandwidth
maxy = 0.7, # y scale for plot
curves = 'curves', # module to transmit curves:
)
Mod('curves',
cls = 'frappy_psi.ultrasound.Curves',
description = 't, I, Q and pulse arrays for plot',
)
Mod('delay',
cls = 'frappy__psi.dg645.Delay',
description = 'delay line with 2 channels',
uri = 'serial:///dev/ttyS2',
on1 = 1e-9,
on2 = 1E-9,
off1 = 400e-9,
off2 = 600e-9,
)
Mod('pars',
cls = 'frappy_psi.ultrasound.Pars',
description = 'SEA parameters',
)
def roi(nr, time=None, size=300):
Mod(f'roi{nr}',
cls = 'frappy_psi.ultrasound.Roi',
description = f'I/Q of region {nr}',
main = 'f',
time=time or 4000,
size=size,
enable=time is not None,
)
roi(0, 2450) # you may add size as argument if not default
roi(1, 5950)
roi(2, 9475)
roi(3, 12900)
roi(4, 16100)
roi(5) # disabled
roi(6)
roi(7)
roi(8)
roi(9)

87
cfg/PEUS_cfg.py Normal file
View File

@@ -0,0 +1,87 @@
Node('PEUS.psi.ch',
'ultrasound, pulse_echo configuration',
interface='5000',
)
Mod('u',
'frappy_psi.ultrasound.PulseEcho',
'ultrasound acquisition loop',
freq='f',
# pollinterval=0.1,
time=900.0,
size=5000.0,
nr=500,
sr=32768,
bw=1e7,
)
Mod('fio',
'frappy_psi.ultrasound.FreqStringIO', '',
uri='serial:///dev/ttyS1?baudrate=57600',
)
Mod('f',
'frappy_psi.ultrasound.Frequency',
'writable for frequency',
output='R', # L for LF (bnc), R for RF (type N)
io='fio',
amp=0.5, # VPP
)
Mod('fdif',
'frappy_psi.ultrasound.FrequencyDif',
'writable for frequency minus base frequency',
freq='f',
base=41490200.0,
)
# Mod('curves',
# 'frappy_psi.ultrasound.Curves',
# 't, I, Q and pulse arrays for plot',
# )
def roi(name, time, size, components='iqpa', enable=True, control=False, freq=None, **kwds):
description = 'I/Q of region {name}'
if freq:
kwds.update(cls='frappy_psi.ultrasound.ControlRoi',
description=f'{description} as control loop',
freq=freq, **kwds)
else:
kwds.update(cls='frappy_psi.ultrasound.Roi',
description=description, **kwds)
kwds.update({c: name + c for c in components})
Mod(name,
main='u',
time=time,
size=size,
enable=enable,
**kwds,
)
for c in components:
Mod(name + c,
'frappy.modules.Readable',
f'{name}{c} component',
)
# control loop
roi('roi0', 2450, 300, freq='f', maxstep=100000, minstep=4000)
# other rois
roi('roi1', 5950, 300)
roi('roi2', 9475, 300)
roi('roi3', 12900, 300)
#roi('roi4', 400, 30, False)
#roi('roi5', 400, 30, False)
#roi('roi6', 400, 30, False)
#roi('roi7', 400, 30, False)
#roi('roi8', 400, 30, False)
#roi('roi9', 400, 30, False)
Mod('delay',
'frappy_psi.dg645.Delay',
'delay line with 2 channels',
uri='serial:///dev/ttyS2',
on1=1e-09,
on2=1e-09,
off1=4e-07,
off2=6e-07,
)

View File

@@ -1,62 +0,0 @@
Node(equipment_id = 'r_ultrasound.psi.ch',
description = 'resonant ultra sound setup',
interface = 'tcp://5000',
)
Mod('f',
cls = 'frappy_psi.ultrasound.Frequency',
description = 'ultrasound frequency and acquisition loop',
uri = 'serial:///dev/ttyS1',
pars = 'pars',
pollinterval = 0.1,
time = 900, # start time
size = 5000,
freq = 1.e+03,
basefreq = 1.E+3,
control = False,
rusmode = False,
amp = 2.5,
nr = 1, #500 #300 #100 #50 #30 #10 #5 #3 #1 #1000 #500 #300 #100 #50 #30 #10 #5 #3 #1 #500
sr = 1E8, #16384
plot = True,
maxstep = 100000,
bw = 10E6, #butter worth filter bandwidth
maxy = 0.7, # y scale for plot
curves = 'curves', # module to transmit curves:
)
Mod('curves',
cls = 'frappy_psi.ultrasound.Curves',
description = 't, I, Q and pulse arrays for plot',
)
Mod('roi0',
cls = 'frappy_psi.ultrasound.Roi',
description = 'I/Q of region in the control loop',
time = 300, # this is the center of roi:
size = 5000,
main = f,
)
Mod('roi1',
cls = 'frappy_psi.ultrasound.Roi',
description = 'I/Q of region 1',
time = 100, # this is the center of roi:
size = 300,
main = f,
)
Mod('delay',
cls = 'frappy__psi.dg645.Delay',
description = 'delay line with 2 channels',
uri = 'serial:///dev/ttyS2',
on1 = 1e-9,
on2 = 1E-9,
off1 = 400e-9,
off2 = 600e-9,
)
Mod('pars',
cls = 'frappy_psi.ultrasound.Pars',
description = 'SEA parameters',
)

39
cfg/RUS_cfg.py Normal file
View File

@@ -0,0 +1,39 @@
Node(equipment_id = 'r_ultrasound.psi.ch',
description = 'resonant ultra sound setup',
interface = 'tcp://5000',
)
Mod('iq',
cls = 'frappy_psi.ultrasound.RUS',
description = 'ultrasound iq mesurement',
imod = 'i',
qmod = 'q',
freq='f',
input_range=10, # VPP
input_delay = 0,
periods = 163,
)
Mod('freqio',
'frappy_psi.ultrasound.FreqStringIO',
' ',
uri = 'serial:///dev/ttyS1?baudrate=57600',
)
Mod('f',
cls = 'frappy_psi.ultrasound.Frequency',
description = 'ultrasound frequency',
io='freqio',
output='L', # L for LF (bnc), R for RF (type N)
target=10000,
)
Mod('i',
cls='frappy.modules.Readable',
description='I component',
)
Mod('q',
cls='frappy.modules.Readable',
description='Q component',
)

40
cfg/acquisition_cfg.py Normal file
View File

@@ -0,0 +1,40 @@
Node('measure.frappy.demo',
'''Measureable demo''',
'tcp://10770',
)
Mod('control',
'frappy_demo.acquisition.Controller',
'simple demo controller',
channels = {'first': 'chan1', 'second': 'chan2', 'third': 'chan3'},
pollinterval = 1,
)
Mod('chan1',
'frappy_demo.acquisition.Channel',
'simple channel demo',
goal = 50,
goal_enable = True,
pollinterval = 1,
)
Mod('chan2',
'frappy_demo.acquisition.Channel',
'simple channel demo',
pollinterval = 1,
)
Mod('chan3',
'frappy_demo.acquisition.Channel',
'simple channel demo',
pollinterval = 1,
)
Mod('single',
'frappy_demo.acquisition.SimpleAcquisition',
'Acquisition demo',
pollinterval = 1,
goal = 20,
goal_enable=True,
acquisition_key='single',
)
Mod('ng',
'frappy_demo.acquisition.NoGoalAcquisition',
'Acquisition demo',
pollinterval = 5,
)

17
cfg/addons/ah2700_cfg.py Normal file → Executable file
View File

@@ -2,8 +2,17 @@ Node('ah2700.frappy.psi.ch',
'Andeen Hagerlin 2700 Capacitance Bridge', 'Andeen Hagerlin 2700 Capacitance Bridge',
) )
Mod('cap', Mod('cap_io',
'frappy_psi.ah2700.Capacitance', 'frappy_psi.ahcapbridge.IO', '',
'capacitance', uri='linse-leiden-ts:3002'
uri='dil4-ts.psi.ch:3008',
) )
Mod('cap',
'frappy_psi.ahcapbridge.AH2700',
'capacitance',
io='cap_io',
loss_module = 'loss',
freq_module = 'freq',
)

View File

@@ -0,0 +1,20 @@
Node('ah2700.frappy.psi.ch',
'Andeen Hagerlin 2700 Capacitance Bridge',
)
Mod('cap_io',
'frappy_psi.ah2700.Ah2700IO',
'',
uri='linse-leiden-ts:3002',
timeout=60,
)
# this creates also cap_freq and cap_loss
Mod('cap',
'frappy_psi.ah2700.Capacitance',
'capacitance',
io = 'cap_io',
loss_name='loss',
freq_name='freq',
)

View File

@@ -16,7 +16,7 @@ Mod('ah',
'frappy_psi.sea.SeaReadable', '', 'frappy_psi.sea.SeaReadable', '',
io='sea_addons', io='sea_addons',
sea_object='cap', sea_object='cap',
extra_modules = ['cap', 'loss'] extra_modules = ['cap', 'loss', 'freq']
) )
Mod('cap', Mod('cap',
@@ -32,6 +32,12 @@ Mod('loss',
single_module='ah.loss', single_module='ah.loss',
) )
Mod('freq',
'frappy_psi.sea.SeaWritable', '',
io='sea_addons',
single_module='ah.freq',
)
Mod('capslope', Mod('capslope',
'frappy_psi.sea.SeaReadable', '', 'frappy_psi.sea.SeaReadable', '',
io='sea_addons', io='sea_addons',

31
cfg/addons/ahtwo_cfg.py Normal file
View File

@@ -0,0 +1,31 @@
Node('ahtwo.frappy.psi.ch',
'Andeen Hagerlin 2700 and 2550 Capacitance Bridges',
)
# TODO: adapt names (cap, cap2) to your experiment
Mod('cap_io',
'frappy_psi.ahcapbridge.IO', '',
uri='linse-leiden-ts:3002'
)
Mod('cap',
'frappy_psi.ahcapbridge.AH2700',
'capacitance',
io='cap_io',
loss_module = 'loss',
freq_module = 'freq',
)
Mod('cap2_io',
'frappy_psi.ahcapbridge.IO', '',
uri='linse-leiden-ts:3001'
)
Mod('cap2',
'frappy_psi.ahcapbridge.AH2550',
'capacitance',
io='cap2_io',
loss_module = 'loss2',
)

View File

@@ -0,0 +1,15 @@
Node('haake.frappy.psi.ch',
'additional haake waterbath',
)
Mod('haake_io',
'frappy_psi.haake.HaakeIO',
'',
uri='sans-sample-ts:3006',
)
Mod('T2',
'frappy_psi.haake.TemperatureLoop',
'second haake',
io = 'haake_io',
)

28
cfg/addons/sr830_cfg.py Normal file
View File

@@ -0,0 +1,28 @@
Node('srs830.ppms.psi.ch',
'',
interface='tcp://5000',
)
Mod('b',
'frappy_psi.SR830.XY',
'signal from Stanford Rasearch lockin',
uri='linse-976d-ts:3002',
)
Mod('bx',
'frappy_psi.parmod.Comp',
'x-comp',
read='b.value[0]',
unit='V',
)
Mod('by',
'frappy_psi.parmod.Comp',
'y-comp',
read='b.value[1]',
unit='V',
)
Mod('bf',
'frappy_psi.parmod.Par',
'lockin frequency',
read='b.freq',
unit='Hz',
)

View File

@@ -3,8 +3,15 @@ Node('AH2700Test.psi.ch',
'tcp://5000', 'tcp://5000',
) )
Mod('cap', Mod('io',
'frappy_psi.ah2700.Capacitance', 'frappy_psi.ahcapbridge.IO', '',
'capacitance', uri='linse-leiden-ts:3002'
uri='ldmse3-ts:3015', )
Mod('cap',
'frappy_psi.ahcapbridge.AH2700',
'capacitance',
io='io',
loss_module = 'loss',
freq_module = 'freq',
) )

340
cfg/dil5_cfg.py Normal file
View File

@@ -0,0 +1,340 @@
# by id (independent of plug location, but may not neccessarly be unique)
# to verify just do:
# ls /dev/serial/by-id
turbo_uri = '/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A601PCGF-if00-port0'
press_uri = '/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AH07445U-if00-port0'
itc_uri = '/dev/serial/by-id/usb-Prolific_Technology_Inc._USB-Serial_Controller_D-if00-port0'
lsc_uri = '192.168.1.2:7777'
logo_ip = '192.168.0.3'
# by plug location would also be possible (/dev/serial/by-path)
Node('dil5.psi.ch',
'dil5 on linse-dil5',
interface='tcp://5000',
secondary = ['ws://8010']
)
Mod('logo',
'frappy_psi.logo.IO',
'',
ip_address = logo_ip,
tcap_client = 0x3000,
tsap_server = 0x2000
)
Mod('V1',
'frappy_psi.logo.DigitalActuator',
'Valves',
io = 'logo',
feedback_addr ="V1025.0",
output_addr ="V1064.3"
)
Mod('V2',
'frappy_psi.logo.DigitalActuator',
'dil bypass',
io = 'logo',
feedback_addr ="V1024.2",
output_addr ="V1064.0",
)
Mod('V4',
'frappy_psi.logo.DigitalActuator',
'compressor to dump',
io = 'logo',
# feedback seems not to work
output_addr ="V1064.7",
target_addr ="V404.1",
)
Mod('V5',
'frappy_psi.logo.DigitalActuator',
'compressor input',
io = 'logo',
feedback_addr ="V1024.4",
output_addr ="V1064.2",
)
Mod('V9',
'frappy_psi.logo.DelayedActuator',
'dump output',
io = 'logo',
delay_addr = 'VW24',
feedback_addr ="V1024.3",
output_addr ="V1064.5",
target_addr ="V404.3",
)
Mod('forepump',
'frappy_psi.logo.DigitalActuator',
'forepump',
io = 'logo',
output_addr ="V1064.6",
target_addr ="V404.4",
)
Mod('compressor',
'frappy_psi.logo.DigitalActuator',
'',
io = 'logo',
output_addr ="V1064.4",
target_addr ="V404.2",
)
Mod('p2',
'frappy_psi.logo.Pressure',
'pressure after compressor',
io = 'logo',
addr ="VW0",
pollinterval=0.5,
)
Mod('p1',
'frappy_psi.logo.Pressure',
'dump pressure',
io = 'logo',
addr ="VW28",
pollinterval=0.5,
)
Mod('p5',
'frappy_psi.logo.Pressure',
'pressure after forepump',
io = 'logo',
addr ="VW4",
pollinterval = 0.5,
)
Mod('airpressure',
'frappy_psi.logo.Comparator',
'Airpressure state',
io = 'logo',
addr ="V1024.7",
threshold = 500,
pollinterval = 0.5,
)
Mod('io_pfeiffer',
'frappy_psi.pfeiffer_new.PfeifferProtocol',
'',
uri=f'serial://{press_uri}?baudrate=9600+parity=none+bytesize=8+stopbits=1',
)
Mod('io_turbo',
'frappy_psi.pfeiffer_new.PfeifferProtocol',
'',
uri=f'serial://{turbo_uri}?baudrate=9600+parity=none+bytesize=8+stopbits=1',
)
Mod('p3',
'frappy_psi.pfeiffer_new.RPT200',
'Pressure in HPa',
io = 'io_pfeiffer',
address= 2,
)
Mod('p4',
'frappy_psi.pfeiffer_new.RPT200',
'Pressure in HPa',
io = 'io_pfeiffer',
address= 4
)
Mod('turbopump',
'frappy_psi.pfeiffer_new.TCP400',
'Pfeiffer Turbopump',
io = 'io_turbo',
address= 1
)
Mod('MV10',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV10'
)
Mod('MV13',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV13'
)
Mod('MV8',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV8'
)
Mod('MVB',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MVB'
)
Mod('MV2',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV2'
)
Mod('MV1',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV1'
)
Mod('MV3a',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV3a'
)
Mod('MV3b',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV3b'
)
Mod('GV1',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve GV1'
)
Mod('GV2',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve GV2'
)
Mod('MV14',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV14'
)
Mod('MV12',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV12'
)
Mod('MV11',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV11'
)
Mod('MV9',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV9'
)
Mod('itc',
'frappy_psi.mercury.IO',
'connection to MercuryiTC',
uri=f'serial://{itc_uri}?baudrate=115200+parity=none+bytesize=8+stopbits=1',
)
Mod('T_still_wup',
'frappy_psi.mercury.TemperatureLoop',
'still warmup temperature',
slot='MB1.T1',
io='itc',
)
Mod('T_one_K',
'frappy_psi.mercury.TemperatureLoop',
'1 K plate warmup temperature',
slot='DB5.T1',
io='itc',
)
Mod('T_mix_wup',
'frappy_psi.mercury.TemperatureLoop',
'mix. chamber warmup temperature',
slot='DB6.T1',
io='itc',
)
Mod('T_ivc_wup',
'frappy_psi.mercury.TemperatureLoop',
'IVC warmup temperature',
slot='DB7.T1',
io='itc',
)
Mod('T_cond',
'frappy_psi.mercury.TemperatureLoop',
'condenser temperature',
slot='DB8.T1',
io='itc',
)
Mod('safety',
'frappy_psi.dilution.Interlock',
'interlock mechanism',
io='logo',
dil='dil',
)
Mod('dil',
'frappy_psi.dilution.DIL5',
'dilution state machine and parameters',
condenseline_pressure = "p2",
condense_valve = "V9",
dump_valve = "V4",
forepump = "forepump",
compressor = "compressor",
turbopump = "turbopump",
condenseline_valve = "V1",
circuitshort_valve = "V2",
still_pressure = "p4",
still_pressure_turbo = "p3",
#ls372 = "res1",
dump_pressure = "p1",
condensing_p_low = 1200,
condensing_p_high = 1500,
)
## Dilution lakeshore Temperature controller
Mod('io_ls273',
'frappy_psi.ls372.StringIO',
'io for Ls372',
uri=lsc_uri,
)
Mod('sw',
'frappy_psi.ls372.Switcher',
'channel switcher',
io = 'io_ls273',
)
Mod('T_ivc',
'frappy_psi.ls372.TemperatureChannel',
'mix temperature chan 2',
channel = 2,
switcher = 'sw',
)
Mod('T_still',
'frappy_psi.ls372.TemperatureChannel',
'mix temperature chan 3',
channel = 3,
switcher = 'sw',
)
Mod('T_sorb',
'frappy_psi.ls372.TemperatureChannel',
'mix temperature chan 1',
channel = 1,
switcher = 'sw',
)
Mod('T_cp',
'frappy_psi.ls372.TemperatureChannel',
'mix temperature chan 4',
channel = 4,
switcher = 'sw',
)
Mod('T_mix',
'frappy_psi.ls372.TemperatureLoop',
'mix temperature chan 5',
channel = 5,
htrrng = '1mA',
switcher = 'sw',
)

16
cfg/dilhtr_cfg.py Normal file
View File

@@ -0,0 +1,16 @@
Node('dilhtrtest.psi.ch',
'dilhtr test',
'tcp://5000',
)
Mod('io',
'frappy_psi.dilhtr.IO',
'dilhtr communication',
uri='serial:///dev/tty.usbserial-21440?baudrate=9600',
)
Mod('heater',
'frappy_psi.dilhtr.Heater',
'dilhtr box',
io='io',
)

136
cfg/dummy_cfg.py Normal file
View File

@@ -0,0 +1,136 @@
Node('test.config.frappy.demo',
'''short description of the testing sec-node
This description for the node can be as long as you need if you use a multiline string.
Very long!
The needed fields are Equipment id (1st argument), description (this)
and the main interface of the node (3rd arg)
''',
'tcp://5000',
)
Mod('attachtest',
'frappy_demo.test.WithAtt',
'test attached',
att = 'LN2',
)
Mod('pinata',
'frappy_demo.test.Pin',
'scan test',
)
Mod('recursive',
'frappy_demo.test.RecPin',
'scan test',
)
Mod('LN2',
'frappy_demo.test.LN2',
'random value between 0..100%',
value = Param(default = 0, unit = '%'),
)
Mod('heater',
'frappy_demo.test.Heater',
'some heater',
maxheaterpower = 10,
)
Mod('T1',
'frappy_demo.test.Temp',
'some temperature',
sensor = 'X34598T7',
)
Mod('T2',
'frappy_demo.test.Temp',
'some temperature',
sensor = 'X34598T8',
)
Mod('T3',
'frappy_demo.test.Temp',
'some temperature',
sensor = 'X34598T9',
)
Mod('Lower',
'frappy_demo.test.Lower',
'something else',
)
Mod('Decision',
'frappy_demo.test.Mapped',
'Random value from configured property choices. Config accepts anything ' \
'that can be converted to a list',
choices = ['Yes', 'Maybe', 'No'],
)
Mod('c',
'frappy_demo.test.Commands',
'a command test',
)
Mod('cryo',
'frappy_demo.cryo.Cryostat',
'A simulated cc cryostat with heat-load, specific heat for the sample and a '
'temperature dependent heat-link between sample and regulation.',
group='very important/stuff',
jitter=0.1,
T_start=10.0,
target=10.0,
looptime=1,
ramp=6,
maxpower=20.0,
heater=4.1,
mode='pid',
tolerance=0.1,
window=30,
timeout=900,
p = Param(40, unit='%/K'), # in case 'default' is the first arg, we can omit 'default='
i = 10,
d = 2,
pid = Group('p', 'i', 'd'),
pollinterval = Param(export=False),
value = Param(unit = 'K', test = 'customized value'),
)
Mod('heatswitch',
'frappy_demo.modules.Switch',
'Heatswitch for `mf` device',
switch_on_time = 5,
switch_off_time = 10,
)
Mod('bool',
'frappy_demo.modules.BoolWritable',
'boolean writable test',
)
Mod('lscom',
'frappy_psi.ls370sim.Ls370Sim',
'simulated serial communicator to a LS 370',
visibility = 3
)
Mod('sw',
'frappy_psi.ls370res.Switcher',
'channel switcher for Lsc controller',
io = 'lscom',
)
Mod('a',
'frappy_psi.ls370res.ResChannel',
'resistivity',
channel = 1,
switcher = 'sw',
)
Mod('b',
'frappy_psi.ls370res.ResChannel',
'resistivity',
channel = 3,
switcher = 'sw',
)

100
cfg/fi2_cfg.py Normal file
View File

@@ -0,0 +1,100 @@
Node('fi2.psi.ch',
'vacuum furnace ILL Type',
'tcp://5000',
)
Mod('htr_io',
'frappy_psi.tdkpower.IO',
'powersupply communicator',
uri = 'serial:///dev/ttyUSB0',
)
Mod('htr',
'frappy_psi.tdkpower.Power',
'heater power',
io= 'htr_io',
)
Mod('out',
'frappy_psi.tdkpower.Output',
'heater output',
io = 'htr_io',
maxvolt = 5,
maxcurrent = 25,
)
Mod('relais',
'frappy_psi.ionopimax.DigitalOutput',
'relais for power output',
addr = 'o2',
)
Mod('T_main',
'frappy_psi.ionopimax.CurrentInput',
'sample temperature',
addr = 'ai4',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_extra',
'frappy_psi.ionopimax.CurrentInput',
'extra temperature',
addr = 'ai3',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_htr',
'frappy_psi.ionopimax.CurrentInput',
'heater temperature',
addr = 'ai2',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_wall',
'frappy_psi.ionopimax.VoltageInput',
'furnace wall temperature',
addr = 'av2',
rawrange = (0, 1.5),
valuerange = (0, 150),
value = Param(unit='degC'),
)
Mod('T',
'frappy_psi.picontrol.PI',
'controlled Temperature',
input = 'T_htr',
output = 'out',
relais = 'relais',
p = 2,
i = 0.01,
)
Mod('interlocks',
'frappy_psi.furnace.Interlocks',
'interlock parameters',
input = 'T_htr',
wall_T = 'T_wall',
vacuum = 'p',
relais = 'relais',
control = 'T',
wall_limit = 50,
vacuum_limit = 0.1,
)
Mod('p_io',
'frappy_psi.pfeiffer.IO',
'pressure io',
uri='serial:///dev/ttyUSBlower',
)
Mod('p',
'frappy_psi.pfeiffer.Pressure',
'pressure reading',
io = 'p_io',
)

116
cfg/fi_cfg.py Normal file
View File

@@ -0,0 +1,116 @@
Node('fi.psi.ch',
'ILL furnace',
'tcp://5000',
)
Mod('T_main',
'frappy_psi.furnace.PRtransmitter',
'sample temperature',
addr='ai2',
valuerange=(0, 2300),
value=Param(unit='degC'),
)
Mod('T_extra',
'frappy_psi.furnace.PRtransmitter',
'extra temperature',
addr='ai1',
valuerange=(0, 2300),
value=Param(unit='degC'),
)
Mod('T_wall',
'frappy_psi.ionopimax.VoltageInput',
'furnace wall temperature',
addr='av2',
rawrange=(0, 1.5),
valuerange=(0, 150),
value=Param(unit='degC'),
)
Mod('T3',
'frappy_psi.furnace.PRtransmitter',
'extra temperature',
addr='ai3',
valuerange=(0, 1372),
value=Param(unit='degC'),
)
Mod('T4',
'frappy_psi.furnace.PRtransmitter',
'extra temperature',
addr='ai4',
valuerange=(0, 1372),
value=Param(unit='degC'),
)
Mod('T',
'frappy_psi.furnace.PIctrl',
'controlled temperature ',
value = Param(unit='degC'),
input_module = 'T_htr',
output_module = 't_out',
output_min = 0,
output_max = 100,
p = 1,
i = 0.01,
)
Mod('htr_io',
'frappy_psi.tdkpower.IO',
'powersupply communicator',
uri='serial:///dev/ttyUSB0?baudrate=9600',
)
Mod('htr_power',
'frappy_psi.tdkpower.Power',
'heater power',
io='htr_io',
)
Mod('htr',
'frappy_psi.furnace.TdkOutput',
'heater output',
io='htr_io',
maxvolt=8,
maxcurrent=200,
)
Mod('flowswitch',
'frappy_psi.ionopimax.DigitalInput',
'flow switch',
addr='dt2',
true_level='low',
)
Mod('interlock',
'frappy_psi.furnace.Interlocks',
'interlock parameters',
main_T='T_main',
extra_T='T_extra',
wall_T='T_wall',
vacuum='p',
control='T',
htr='htr',
flowswitch='flowswitch',
wall_limit=50,
main_T_limit = 1400,
extra_T_limit = 1400,
vacuum_limit=0.001,
)
Mod('p',
'frappy_psi.furnace.PKRgauge',
'pressure reading',
addr = 'av1',
rawrange = (1.82, 8.6),
valuerange = (5e-9, 1000),
value = Param(unit='mbar'),
)
Mod('vso',
'frappy_psi.ionopimax.VoltagePower',
'voltage power output',
target = 24,
export = False,
)

132
cfg/fs_cfg.py Normal file
View File

@@ -0,0 +1,132 @@
Node('fs.psi.ch',
'small vacuum furnace',
'tcp://5000',
)
Mod('T',
'frappy_psi.furnace.PI2',
'controlled Temperature on sample (2nd loop)',
value = Param(unit='degC'),
meaning = ['temperature', 30],
input_module = 'T_sam',
output_module = 'T_reg',
p = 1.2,
i = 0.005,
)
Mod('T_reg',
'frappy_psi.furnace.PIctrl',
'controlled Temperature on heater',
value = Param(unit='degC'),
input_module = 'T_htr',
output_module = 't_out',
output_min = 0,
output_max = 100,
p = 1,
i = 0.003,
)
#Mod('p_reg',
# 'frappy_psi.furnace.PI',
# 'controlled pressure',
# input_module = 'p',
# output_module = 't_out',
# p = 1,
# i = 0.005,
# )
Mod('T_htr',
'frappy_psi.furnace.PRtransmitter',
'heater temperature',
addr = 'ai4',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_sam',
'frappy_psi.furnace.PRtransmitter',
'sample temperature',
addr = 'ai2',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_extra',
'frappy_psi.furnace.PRtransmitter',
'extra temperature',
addr = 'ai3',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_wall',
'frappy_psi.ionopimax.VoltageInput',
'furnace wall temperature',
addr = 'av2',
rawrange = (0, 1.5),
valuerange = (0, 150),
value = Param(unit='degC'),
)
Mod('htr_io',
'frappy_psi.bkpower.IO',
'powersupply communicator',
uri = 'serial:///dev/ttyUSBupper',
)
Mod('htr',
'frappy_psi.bkpower.Power',
'heater power',
io= 'htr_io',
)
Mod('t_out',
'frappy_psi.bkpower.Output',
'heater output',
# p_value = 'p_out',
io = 'htr_io',
maxvolt = 50,
maxcurrent = 2,
)
Mod('relay',
'frappy_psi.ionopimax.DigitalOutput',
'relais for power output',
addr = 'o2',
)
Mod('interlock',
'frappy_psi.furnace.Interlocks',
'interlock parameters',
input = 'T_htr',
wall_T = 'T_wall',
htr_T = 'T_htr',
main_T = 'T_sam',
reg_T = 'T_reg',
extra_T = 'T_extra',
htr = 't_out',
vacuum = 'p',
relay = 'relay',
control = 'T',
wall_limit = 60,
vacuum_limit = 0.001,
disabled_checks = 'T_extra',
)
Mod('p',
'frappy_psi.furnace.PKRgauge',
'pressure reading',
addr = 'av1',
rawrange = (1.82, 8.6),
valuerange = (5e-9, 1000),
value = Param(unit='mbar'),
)
Mod('vso',
'frappy_psi.ionopimax.VoltagePower',
'voltage power output',
target = 24,
export = False,
)

94
cfg/gas10ka_cfg.py Normal file
View File

@@ -0,0 +1,94 @@
Node('gas10ka.psi.ch',
'10kBar Gas pressure stick',
interface='tcp://5010',
)
Mod('io',
'frappy_psi.logo.IO',
'',
ip_address = "192.168.1.1",
tcap_client = 0x3000,
tsap_server = 0x2000
)
Mod('R_pt10k',
'frappy_psi.logo.Resistor',
'raw sensor value of T_p10k',
io = 'io',
addr = "VW0",
)
Mod('T_pt10k',
'frappy_psi.softcal.Sensor',
'temperature close to sample',
value=Param(unit='K'),
rawsensor='R_pt10k',
calcurve='pt10000e',
)
Mod('R_top',
'frappy_psi.logo.Resistor',
'raw sensor value of T_top',
io = 'io',
addr = "VW2",
)
Mod('T_top',
'frappy_psi.softcal.Sensor',
'capillary temperature at highest position',
value=Param(unit='K'),
rawsensor='R_top',
calcurve='pt1000e',
)
Mod('R_mid',
'frappy_psi.logo.Resistor',
'raw sensor value of T_mid',
io = 'io',
addr = "VW6",
)
Mod('T_mid',
'frappy_psi.softcal.Sensor',
'capillary temperature at mid position',
value=Param(unit='K'),
rawsensor='R_mid',
calcurve='pt1000e',
)
Mod('R_bot',
'frappy_psi.logo.Resistor',
'raw sensor value of T_bot',
io = 'io',
addr = "VW4",
)
Mod('T_bot',
'frappy_psi.softcal.Sensor',
'capillary temperature at lower position',
value=Param(unit='K'),
rawsensor='R_bot',
calcurve='pt1000e',
)
Mod('R_sam_cx',
'frappy_psi.logo.Resistor',
'sensor',
io = 'io',
addr = "VW16",
)
Mod('T_sam_cx',
'frappy_psi.softcal.Sensor',
'?',
value=Param(unit='K'),
rawsensor='R_sam_cx',
calcurve='X174785',
)
Mod('heater',
'frappy_psi.capillary_heater.Heater',
'the capillary heater',
io = 'io',
)

View File

@@ -4,4 +4,4 @@ logdir = ./log
piddir = ./pid piddir = ./pid
confdir = ./cfg confdir = ./cfg
comlog = True comlog = True
omit_unchanged_within = 60

View File

@@ -4,33 +4,22 @@ Node('ls340test.psi.ch',
) )
Mod('io', Mod('io',
'frappy_psi.lakeshore.Ls340IO', 'frappy_psi.lakeshore.IO340',
'communication to ls340', 'communication to ls340',
uri='tcp://ldmprep56-ts:3002' uri='tcp://localhost:7777'
) )
Mod('dev',
'frappy_psi.lakeshore.Device340',
'device for calcurve',
io='io',
curve_handling=True,
)
Mod('T', Mod('T',
'frappy_psi.lakeshore.TemperatureLoop340',
'sample temperature',
output_module='Heater',
target=Param(max=470),
io='io',
channel='B'
)
Mod('T_cold_finger',
'frappy_psi.lakeshore.Sensor340', 'frappy_psi.lakeshore.Sensor340',
'cold finger temperature', 'sample temperature',
io='io', # output_module='Heater',
channel='A' device='dev',
) channel='A',
calcurve='x29746',
Mod('Heater',
'frappy_psi.lakeshore.HeaterOutput',
'heater output',
channel='B',
io='io',
resistance=25,
max_power=50,
current=1
) )

View File

@@ -6,7 +6,8 @@ Node('LscSIM.psi.ch',
Mod('io', Mod('io',
'frappy_psi.ls370res.StringIO', 'frappy_psi.ls370res.StringIO',
'io for Ls370', 'io for Ls370',
uri = 'localhost:2089', # uri = 'localhost:2089',
uri = 'linse-976d-ts:3007',
) )
Mod('sw', Mod('sw',
'frappy_psi.ls370res.Switcher', 'frappy_psi.ls370res.Switcher',
@@ -17,7 +18,7 @@ Mod('res1',
'frappy_psi.ls370res.ResChannel', 'frappy_psi.ls370res.ResChannel',
'resistivity chan 1', 'resistivity chan 1',
vexc = '2mV', vexc = '2mV',
channel = 1, channel = 2,
switcher = 'sw', switcher = 'sw',
) )
Mod('res2', Mod('res2',

View File

@@ -10,7 +10,6 @@ Mod('sea_main',
Mod('te', Mod('te',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.SeaDrivable', '',
io = 'sea_main', io = 'sea_main',
meaning=['temperature', 20],
sea_object = 'te', sea_object = 'te',
meaning=('temperature', 11), meaning=('temperature', 11),
) )

View File

@@ -1,21 +1,15 @@
Node('haakeuro.config.sea.psi.ch', Node('haake.frappy.psi.ch',
'Haake thermostat + Eurotherm controller', 'additional haake waterbath',
) )
Mod('sea_main',
'frappy_psi.sea.SeaClient', Mod('haake_io',
'main sea connection for haakeuro.config', 'frappy_psi.haake.HaakeIO',
config = 'haake.config', '',
service = 'main', uri='sans-sample-ts:3006',
) )
Mod('th',
'frappy_psi.sea.SeaDrivable', '', Mod('T2',
meaning = ('temperature', 10), 'frappy_psi.haake.TemperatureLoop',
io = 'sea_main', 'second haake',
sea_object = 'th', io = 'haake_io',
extra_modules=['t2'],
)
Mod('ts',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
single_module='th.t2',
) )

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('pauto', Mod('pauto',

View File

@@ -14,7 +14,8 @@ Mod('tt',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tt', 'set'], rel_paths=['main', '.', 'set'],
value=Param(unit='K'),
) )
Mod('T_ccr', Mod('T_ccr',
@@ -22,6 +23,7 @@ Mod('T_ccr',
io='sea_main', io='sea_main',
sea_object='tt', sea_object='tt',
rel_paths=['ccr'], rel_paths=['ccr'],
value=Param(unit='K'),
) )
Mod('jtccr', Mod('jtccr',
@@ -101,30 +103,35 @@ Mod('p1',
'frappy_psi.sea.SeaReadable', '', 'frappy_psi.sea.SeaReadable', '',
io='sea_main', io='sea_main',
sea_object='p1', sea_object='p1',
value=Param(unit='mbar'),
) )
Mod('p2', Mod('p2',
'frappy_psi.sea.SeaReadable', '', 'frappy_psi.sea.SeaReadable', '',
io='sea_main', io='sea_main',
sea_object='p2', sea_object='p2',
value=Param(unit='mbar'),
) )
Mod('p3', Mod('p3',
'frappy_psi.sea.SeaReadable', '', 'frappy_psi.sea.SeaReadable', '',
io='sea_main', io='sea_main',
sea_object='p3', sea_object='p3',
value=Param(unit='mbar'),
) )
Mod('p4', Mod('p4',
'frappy_psi.sea.SeaReadable', '', 'frappy_psi.sea.SeaReadable', '',
io='sea_main', io='sea_main',
sea_object='p4', sea_object='p4',
value=Param(unit='mbar'),
) )
Mod('pressreg', Mod('pressreg',
'frappy_psi.sea.SeaReadable', '', 'frappy_psi.sea.SeaReadable', '',
io='sea_main', io='sea_main',
sea_object='pressreg', sea_object='pressreg',
value=Param(unit='mbar'),
) )
Mod('epc', Mod('epc',

224
cfg/main/leiden_cfg.py Normal file
View File

@@ -0,0 +1,224 @@
Node('leiden.psi.ch',
'''Leiden Dilution''',
)
ah2700_uri = 'linse-leiden-ts:3002' # used in cfg/addons/ahtwo_cfg.pt
ls370_uri = 'linse-leiden-ts:3004' # used in ~/sea/tcl/leiden.config
tcs_uri = 'linse-leiden-ts:3005'
#nanov_uri = 'linse-leiden-ts:3006' # used in ~/sea/tcl/leiden.config
k2601b_uri = 'linse-leiden-ts:3006' # used for HC experiment as heater
dilhtr_uri = 'linse-leiden-ts:3007'
srbridge_uri = 'linse-leiden-ts:3008'
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for leiden.config',
config = 'leiden.config',
service = 'main',
)
for name in ['T3K', 'Tstill', 'T50mK', 'Tmxlow', 'Tmxhigh', 'Tmxcx', 'Tblueo',
'Tpt50', 'Tpt3high', 'Tpt3low', 'Twhite', 'Tgreen']:
mname = name.replace('T','T_')
Mod(mname,
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='tt',
rel_paths=[name],
value=Param(unit='K'),
extra_modules = ['raw'],
)
Mod(name.replace('T', 'R_'),
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
value=Param(unit='Ohm'),
single_module=f'{mname}.raw'
)
#Mod('cmn',
# 'frappy_psi.sea.SeaReadable', '',
# io = 'sea_main',
# sea_object = 'cmn',
# extra_modules = ['u1', 'u2', 'temp'],
#)
#Mod('T_cmn',
# 'frappy_psi.sea.SeaReadable', '',
# io='sea_main',
# value=Param(unit='K'),
# single_module='cmn.temp',
#)
#Mod('V_fixp',
# 'frappy_psi.sea.SeaReadable', '',
# io='sea_main',
# value=Param(unit='V'),
# single_module='cmn.u2',
#)
#Mod('V_cmn',
# 'frappy_psi.sea.SeaReadable', '',
# io='sea_main',
# value=Param(unit='V'),
# single_module='cmn.u1',
#)
Mod('tcs_io',
'frappy_psi.tcs.IO',
'tcs communication',
uri=tcs_uri,
)
Mod('still_htr',
'frappy_psi.tcs.Heater',
'still heater',
io='tcs_io',
channel=2,
)
Mod('mix_io',
'frappy_psi.dilhtr.IO',
'dilhtr communication',
uri=dilhtr_uri,
)
Mod('mix_htr',
'frappy_psi.dilhtr.WrappedHeater',
'mixing chamber heater',
io='mix_io',
)
Mod('drive_mix',
'frappy_psi.picontrol.PIctrl',
'controlled mix ch. temperature',
input_module = 'T_mxlow',
output_module = 'mix_htr',
output_min = 0,
output_max = 0.02,
p = 5,
itime = 60,
)
#Mod('drive_cmn',
# 'frappy_psi.picontrol.PIctrl',
# 'controlled cmn temperature',
# input_module = 'T_cmn',
# output_module = 'mix_htr',
# output_min = 0,
# output_max = 3e-2,
# p = 2,
# itime = 120,
# )
#Mod('drive_fixp',
# 'frappy_psi.picontrol.PI',
# 'controlled fixpoint voltage',
# value=Param(unit='V'),
# input_module = 'V_fixp',
# output_module = 'drive_mix',
# output_min = 0.0,
# output_max = 0.01,
# p = 1,
# itime = 120,
# )
Mod('simio',
'frappy_psi.bridge.BridgeIO',
'communication to sim900',
uri=srbridge_uri,
)
Mod('res1',
'frappy_psi.bridge.Resistance',
'please add description',
io='simio',
port=1,
)
Mod('res2',
'frappy_psi.bridge.Resistance',
'please add description',
io='simio',
port=3,
)
Mod('phase1',
'frappy_psi.bridge.Phase',
'please add description',
resistance='res1',
)
Mod('phase2',
'frappy_psi.bridge.Phase',
'please add description',
resistance='res2',
)
Mod('dev1',
'frappy_psi.bridge.Deviation',
'please add description',
resistance='res1',
)
Mod('dev2',
'frappy_psi.bridge.Deviation',
'please add description',
resistance='res2',
)
Mod('vsource_io',
'frappy_psi.k2601b.K2601bIO',
'source meter',
# uri = '129.129.156.90:5025',
uri = k2601b_uri,
)
Mod('source',
'frappy_psi.k2601b.SourceMeter'
'',
description = "keithley sourcemeter",
mode = 2,
vlimit = 0.5,
ilimit = .0005,
io = 'vsource_io',
)
Mod('hvolt',
'frappy_psi.k2601b.Voltage'
'',
description = "Heater Voltage",
active = False,
limit = 1.0,
target = 0.0,
sourcemeter = 'source',
io = 'vsource_io',
)
Mod('hcur',
'frappy_psi.k2601b.Current'
'',
description = "Heater Current Source",
active = True,
limit = 0.0001,
target = 0.0,
sourcemeter = 'source',
io = 'vsource_io',
)
Mod('hres',
'frappy_psi.k2601b.Resistivity'
'',
description = "Heater Resistance",
io = 'vsource_io',
)
Mod('hpow',
'frappy_psi.k2601b.Power'
'',
description = "Heater Power",
io = 'vsource_io',
)

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -8,11 +8,12 @@ Mod('sea_main',
service = 'main', service = 'main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io = 'sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object = 'tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',
'frappy_psi.sea.SeaReadable', '', 'frappy_psi.sea.SeaReadable', '',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('th', Mod('th',

View File

@@ -10,12 +10,13 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
) set_path='set',
)
Mod('th', Mod('th',
'frappy_psi.sea.SeaReadable', 'frappy_psi.sea.SeaReadable',

View File

@@ -15,11 +15,12 @@ Mod('sea_main',
#) #)
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
meaning=['temperature_regulation', 27],
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('th', Mod('th',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -2,8 +2,6 @@ Node('mb11.psi.ch',
'MB11 11 Tesla - 100 mm cryomagnet', 'MB11 11 Tesla - 100 mm cryomagnet',
) )
sea_cfg = 'mb11.config'
Mod('itc1', Mod('itc1',
'frappy_psi.mercury.IO', 'frappy_psi.mercury.IO',
'ITC for heat exchanger and pressures', 'ITC for heat exchanger and pressures',

View File

@@ -1,228 +0,0 @@
Node('mb11.psi.ch',
'MB11 11 Tesla - 100 mm cryomagnet',
)
Mod('itc1',
'frappy_psi.mercury.IO',
'ITC for heat exchanger and pressures',
uri='mb11-ts:3001',
)
Mod('itc2',
'frappy_psi.mercury.IO',
'ITC for neck and nv heaters',
uri='mb11-ts:3002',
)
Mod('ips',
'frappy_psi.mercury.IO',
'IPS for magnet and levels',
uri='mb11-ts:3003',
)
Mod('T_stat',
'frappy_psi.mercury.TemperatureAutoFlow',
'static heat exchanger temperature',
meaning=['temperature_regulation', 27],
output_module='htr_stat',
needle_valve='p_stat',
slot='DB6.T1',
io='itc1',
tolerance=0.1,
flowpars=((1,5), (2, 20)),
)
Mod('htr_stat',
'frappy_psi.mercury.HeaterOutput',
'static heat exchanger heater',
slot='DB1.H1',
io='itc1',
)
Mod('ts',
'frappy_psi.mercury.TemperatureLoop',
'sample temperature',
output_module='htr_sample',
slot='MB1.T1',
io='itc1',
tolerance=1.0,
visibility='expert',
)
Mod('htr_sample',
'frappy_psi.mercury.HeaterOutput',
'sample stick heater power',
slot='MB0.H1',
io='itc1',
)
Mod('p_stat',
'frappy_psi.mercury.PressureLoop',
'static needle valve pressure',
output_module='pos_stat',
settling_time=60.0,
slot='DB5.P1',
io='itc1',
tolerance=1.0,
value=Param(
unit='mbar_flow',
),
)
Mod('pos_stat',
'frappy_psi.mercury.ValvePos',
'static needle valve position',
slot='DB5.P1,DB3.G1',
io='itc1',
)
Mod('T_dyn',
'frappy_psi.mercury.TemperatureAutoFlow',
'dynamic heat exchanger temperature',
output_module='htr_dyn',
needle_valve='p_dyn',
slot='DB7.T1',
io='itc1',
tolerance=0.1,
)
Mod('htr_dyn',
'frappy_psi.mercury.HeaterOutput',
'dynamic heat exchanger heater',
slot='DB2.H1',
io='itc1',
)
Mod('p_dyn',
'frappy_psi.mercury.PressureLoop',
'dynamic needle valve pressure',
output_module='pos_dyn',
settling_time=60.0,
slot='DB8.P1',
io='itc1',
tolerance=1.0,
value=Param(
unit='mbar_flow',
),
)
Mod('pos_dyn',
'frappy_psi.mercury.ValvePos',
'dynamic needle valve position',
slot='DB8.P1,DB4.G1',
io='itc1',
)
Mod('mf',
'frappy_psi.ips_mercury.Field',
'magnetic field',
slot='GRPZ',
io='ips',
tolerance=0.001,
wait_stable_field=60.0,
target=Param(
max=11.0,
),
persistent_limit=11.1,
)
Mod('lev',
'frappy_psi.mercury.HeLevel',
'LHe level',
slot='DB1.L1',
io='ips',
)
Mod('n2lev',
'frappy_psi.mercury.N2Level',
'LN2 level',
slot='DB1.L1',
io='ips',
)
Mod('T_neck1',
'frappy_psi.mercury.TemperatureLoop',
'neck heater 1 temperature',
output_module='htr_neck1',
slot='MB1.T1',
io='itc2',
tolerance=1.0,
)
Mod('htr_neck1',
'frappy_psi.mercury.HeaterOutput',
'neck heater 1 power',
slot='MB0.H1',
io='itc2',
)
Mod('T_neck2',
'frappy_psi.mercury.TemperatureLoop',
'neck heater 2 temperature',
output_module='htr_neck2',
slot='DB6.T1',
io='itc2',
tolerance=1.0,
)
Mod('htr_neck2',
'frappy_psi.mercury.HeaterOutput',
'neck heater 2 power',
slot='DB1.H1',
io='itc2',
)
Mod('T_nvs',
'frappy_psi.mercury.TemperatureLoop',
'static needle valve temperature',
output_module='htr_nvs',
slot='DB7.T1',
io='itc2',
tolerance=0.1,
)
Mod('htr_nvs',
'frappy_psi.mercury.HeaterOutput',
'static needle valve heater power',
slot='DB2.H1',
io='itc2',
)
Mod('T_nvd',
'frappy_psi.mercury.TemperatureLoop',
'dynamic needle valve heater temperature',
output_module='htr_nvd',
slot='DB8.T1',
io='itc2',
tolerance=0.1,
)
Mod('htr_nvd',
'frappy_psi.mercury.HeaterOutput',
'dynamic needle valve heater power',
slot='DB3.H1',
io='itc2',
)
Mod('T_coil',
'frappy_psi.mercury.TemperatureSensor',
'coil temperature',
slot='MB1.T1',
io='ips',
)
Mod('om_io',
'frappy_psi.phytron.PhytronIO',
'dom motor IO',
uri='mb11-ts.psi.ch:3004',
)
Mod('om',
'frappy_psi.phytron.Motor',
'stick rotation, typically used for omega',
io='om_io',
target_min=-360,
target_max=360,
encoder_mode='NO',
target=Param(min=-360, max=360),
)

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io = 'sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object = 'tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

20
cfg/main/tfa_cfg.py Normal file
View File

@@ -0,0 +1,20 @@
Node('TFA10.psi.ch',
'thermofisher water bath',
'tcp://5000',
)
Mod('io',
'frappy_psi.thermofisher.ThermFishIO',
'connection for ThermoFisher A10',
uri='tcp://ldm-fi-ts:3002',
)
Mod('T',
'frappy_psi.thermofisher.TemperatureLoopA10',
'holder temperature',
io='io',
meaning=['temperature', 20],
target=Param(max=100),
tolerance=0.5,
settling_time=20,
)

View File

@@ -10,11 +10,12 @@ Mod('sea_main',
) )
Mod('tt', Mod('tt',
'frappy_psi.sea.SeaDrivable', '', 'frappy_psi.sea.LscDrivable', '',
io='sea_main', io='sea_main',
meaning=['temperature_regulation', 27], meaning=['temperature_regulation', 27],
sea_object='tt', sea_object='tt',
rel_paths=['tm', '.', 'set', 'dblctrl'], sensor_path='tm',
set_path='set',
) )
Mod('cc', Mod('cc',

View File

@@ -170,18 +170,20 @@ Mod('htr_nvd',
# Motor controller is not yet available! # Motor controller is not yet available!
# #
#Mod('om_io', '''
# 'frappy_psi.phytron.PhytronIO', Mod('om_io',
# 'dom motor IO', 'frappy_psi.phytron.PhytronIO',
# uri='mb11-ts.psi.ch:3004', 'dom motor IO',
#) uri='mb11-ts.psi.ch:3004',
)
#Mod('om', Mod('om',
# 'frappy_psi.phytron.Motor', 'frappy_psi.phytron.Motor',
# 'stick rotation, typically used for omega', 'stick rotation, typically used for omega',
# io='om_io', io='om_io',
# target_min=-180, target_min=-180,
# target_max=360, target_max=360,
# encoder_mode='NO', encoder_mode='NO',
# target=Param(min=-180, max=360) target=Param(min=-180, max=360)
#) )
'''

100
cfg/muwaba_cfg.py Normal file
View File

@@ -0,0 +1,100 @@
Node('muwaba.psi.ch',
'multi waterbath',
'tcp://5000',
)
Mod('wio_1',
'frappy_psi.thermofisher.ThermFishIO',
'connection for water bath',
uri='serial:///dev/ttyUSB0?baudrate=19200', # 3001 = Port 1, 3002 = Port 2 ...
)
Mod('wio_2',
'frappy_psi.thermofisher.ThermFishIO',
'connection for water bath',
uri='serial:///dev/ttyUSB1?baudrate=19200', # 3001 = Port 1, 3002 = Port 2 ...
)
Mod('wio_3',
'frappy_psi.thermofisher.ThermFishIO',
'connection for water bath',
uri='serial:///dev/ttyUSB2?baudrate=19200', # 3001 = Port 1, 3002 = Port 2 ...
)
Mod('Tbath_1',
'frappy_psi.thermofisher.TemperatureLoopA10',
'water_bath_1',
io='wio_1',
control_active=0,
target=25,
tolerance=0.1,
settling_time=20,
)
Mod('Tbath_2',
'frappy_psi.thermofisher.TemperatureLoopA10',
'water_bath_2',
io='wio_2',
control_active=0,
target=25,
tolerance=0.1,
settling_time=20,
)
Mod('Tbath_3',
'frappy_psi.thermofisher.TemperatureLoopA10',
'water_bath_3',
io='wio_3',
control_active=0,
target=25,
tolerance=0.1,
settling_time=20,
)
Mod('valve_1',
'frappy_psi.ionopimax.DigitalOutput',
'valve_for_fast_water_temperature_changing',
addr = 'o1',
target = 0,
)
Mod('valve_2',
'frappy_psi.ionopimax.DigitalOutput',
'valve_for_fast_water_temperature_changing',
addr = 'o2',
target = 0,
)
Mod('valve_3',
'frappy_psi.ionopimax.DigitalOutput',
'valve_for_fast_water_temperature_changing',
addr = 'o3',
target = 0,
)
Mod('temp_sensor_tc',
'frappy_psi.ionopimax.SimpleVoltageInput',
'temperatur_sensor_sample',
rawrange = (0.0, 10.0),
valuerange = (5.0, 90.0),
addr = 'ai1_mv',
meaning = ['temperature', 20],
value = Param(unit='degC'),
)
Mod('temp_sensor_pt1000',
'frappy_psi.ionopimax.SimpleVoltageInput',
'temperatur_sensor_sample',
rawrange = (0.0, 10.0),
valuerange = (5.0, 90.0),
value = Param(unit='degC'),
addr = 'ai2_mv',
)
Mod('switcher',
'frappy_psi.muwaba.Switcher',
'waterbath switcher',
valve1 = 'valve_1',
valve2 = 'valve_2',
valve3 = 'valve_3',
)

View File

@@ -0,0 +1,23 @@
Node('haake2.config.sea.psi.ch',
'Haake thermostat + Eurotherm controller',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for haakeuro.config',
config = 'haake2.config',
service = 'main',
)
Mod('th',
'frappy_psi.sea.SeaDrivable', '',
meaning = ('temperature', 10),
io = 'sea_main',
sea_object = 'th',
extra_modules=['t2'],
value=Param(unit='degC'),
)
Mod('ts',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
single_module='th.t2',
value=Param(unit='degC'),
)

View File

@@ -0,0 +1,17 @@
Node('haake.config.sea.psi.ch',
'Haake thermostat',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for haakeuro.config',
config = 'haake.config',
service = 'main',
)
Mod('th',
'frappy_psi.sea.SeaDrivable', '',
meaning = ('temperature', 10),
io = 'sea_main',
sea_object = 'th',
extra_modules=['t2'],
value=Param(unit='degC'),
)

View File

@@ -1,14 +1,21 @@
{"cap": {"base": "/cap", "params": [{"path": "", "type": "none", "kids": 8}, {"capff": {"base": "/capff", "params": [
{"path": "send", "type": "text", "readonly": false, "cmd": "cap send", "visibility": 3}, {"path": "", "type": "none", "kids": 7},
{"path": "send", "type": "text", "readonly": false, "cmd": "capff send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3}, {"path": "status", "type": "text", "visibility": 3},
{"path": "cap", "type": "float"}, {"path": "cap", "type": "float"},
{"path": "loss", "type": "float"}, {"path": "loss", "type": "float"},
{"path": "period", "type": "float", "readonly": false, "cmd": "cap period"}, {"path": "period", "type": "float", "readonly": false, "cmd": "capff period"},
{"path": "V", "type": "float", "readonly": false, "cmd": "cap V"}, {"path": "V", "type": "float", "readonly": false, "cmd": "capff V"},
{"path": "average", "type": "int", "readonly": false, "cmd": "cap average"}]}, "capslope": {"base": "/capslope", "params": [{"path": "", "type": "float", "kids": 6}, {"path": "average", "type": "int", "readonly": false, "cmd": "capff average"}]},
{"path": "send", "type": "text", "readonly": false, "cmd": "capslope send", "visibility": 3},
"capslopeff": {"base": "/capslopeff", "params": [
{"path": "", "type": "float", "kids": 6},
{"path": "send", "type": "text", "readonly": false, "cmd": "capslopeff send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3}, {"path": "status", "type": "text", "visibility": 3},
{"path": "node", "type": "text", "readonly": false, "cmd": "capslope node"}, {"path": "node", "type": "text", "readonly": false, "cmd": "capslopeff node"},
{"path": "unit", "type": "float", "readonly": false, "cmd": "capslope unit", "description": "unit=60: mainunits/minutes, unit=1: mainunits/sec"}, {"path": "unit", "type": "float", "readonly": false, "cmd": "capslopeff unit", "description": "unit=60: mainunits/minutes, unit=1: mainunits/sec"},
{"path": "ref", "type": "float", "readonly": false, "cmd": "capslope ref"}, {"path": "ref", "type": "float", "readonly": false, "cmd": "capslopeff ref"},
{"path": "buffersize", "type": "float", "readonly": false, "cmd": "capslope buffersize"}]}} {"path": "bufperiod", "type": "float", "readonly": false, "cmd": "capslopeff bufperiod"}]},
"addonlock_ah2550": {"base": "/addonlock_ah2550", "params": [
{"path": "", "type": "text", "readonly": false, "cmd": "addonlock_ah2550 = "}]}}

View File

@@ -1,4 +1,5 @@
{"cap": {"base": "/cap", "params": [{"path": "", "type": "none", "kids": 8}, {"cap": {"base": "/cap", "params": [
{"path": "", "type": "none", "kids": 8},
{"path": "send", "type": "text", "readonly": false, "cmd": "cap send", "visibility": 3}, {"path": "send", "type": "text", "readonly": false, "cmd": "cap send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3}, {"path": "status", "type": "text", "visibility": 3},
{"path": "cap", "type": "float"}, {"path": "cap", "type": "float"},
@@ -6,10 +7,16 @@
{"path": "period", "type": "float", "readonly": false, "cmd": "cap period"}, {"path": "period", "type": "float", "readonly": false, "cmd": "cap period"},
{"path": "freq", "type": "float", "readonly": false, "cmd": "cap freq"}, {"path": "freq", "type": "float", "readonly": false, "cmd": "cap freq"},
{"path": "V", "type": "float", "readonly": false, "cmd": "cap V"}, {"path": "V", "type": "float", "readonly": false, "cmd": "cap V"},
{"path": "average", "type": "int", "readonly": false, "cmd": "cap average"}]}, "capslope": {"base": "/capslope", "params": [{"path": "", "type": "float", "kids": 6}, {"path": "average", "type": "int", "readonly": false, "cmd": "cap average"}]},
"capslope": {"base": "/capslope", "params": [
{"path": "", "type": "float", "kids": 6},
{"path": "send", "type": "text", "readonly": false, "cmd": "capslope send", "visibility": 3}, {"path": "send", "type": "text", "readonly": false, "cmd": "capslope send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3}, {"path": "status", "type": "text", "visibility": 3},
{"path": "node", "type": "text", "readonly": false, "cmd": "capslope node"}, {"path": "node", "type": "text", "readonly": false, "cmd": "capslope node"},
{"path": "unit", "type": "float", "readonly": false, "cmd": "capslope unit", "description": "unit=60: mainunits/minutes, unit=1: mainunits/sec"}, {"path": "unit", "type": "float", "readonly": false, "cmd": "capslope unit", "description": "unit=60: mainunits/minutes, unit=1: mainunits/sec"},
{"path": "ref", "type": "float", "readonly": false, "cmd": "capslope ref"}, {"path": "ref", "type": "float", "readonly": false, "cmd": "capslope ref"},
{"path": "buffersize", "type": "float", "readonly": false, "cmd": "capslope buffersize"}]}} {"path": "bufperiod", "type": "float", "readonly": false, "cmd": "capslope bufperiod"}]},
"addonlock_ah2700": {"base": "/addonlock_ah2700", "params": [
{"path": "", "type": "text", "readonly": false, "cmd": "addonlock_ah2700 = "}]}}

29
cfg/sea/cp1000.addon.json Normal file
View File

@@ -0,0 +1,29 @@
{"cp2800": {"base": "/cp2800", "params": [
{"path": "", "type": "bool", "readonly": false, "cmd": "cp2800", "kids": 27},
{"path": "send", "type": "text", "readonly": false, "cmd": "cp2800 send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3},
{"path": "comp_running_hrs", "type": "float"},
{"path": "cpu_t", "type": "float"},
{"path": "motor_current_a", "type": "float"},
{"path": "inp_water_t", "type": "float"},
{"path": "inp_water_t_min", "type": "float"},
{"path": "inp_water_t_max", "type": "float"},
{"path": "out_water_t", "type": "float"},
{"path": "out_water_t_min", "type": "float"},
{"path": "out_water_t_max", "type": "float"},
{"path": "helium_t", "type": "float"},
{"path": "helium_t_min", "type": "float"},
{"path": "helium_t_max", "type": "float"},
{"path": "oil_t", "type": "float"},
{"path": "oil_t_min", "type": "float"},
{"path": "oil_t_max", "type": "float"},
{"path": "high_side_p", "type": "float"},
{"path": "high_side_p_min", "type": "float"},
{"path": "high_side_p_max", "type": "float"},
{"path": "high_side_p_avg", "type": "float"},
{"path": "low_side_p", "type": "float"},
{"path": "low_side_p_min", "type": "float"},
{"path": "low_side_p_max", "type": "float"},
{"path": "low_side_p_avg", "type": "float"},
{"path": "high_side_delta_p_avg", "type": "float"},
{"path": "high_side_bounce", "type": "float"}]}}

14
cfg/sea/cp1000_cfg.py Normal file
View File

@@ -0,0 +1,14 @@
Node('cp1000.addon.sea.psi.ch',
'''dry system''',
)
Mod('sea_addons',
'frappy_psi.sea.SeaClient',
'addons sea connection for cp1000.addon',
config = 'cp1000.addon',
service = 'addons',
)
Mod('cp2800',
'frappy_psi.sea.SeaWritable', '',
io = 'sea_addons',
sea_object = 'cp2800',
)

View File

@@ -18,7 +18,7 @@
{"path": "heaterselect", "type": "enum", "enum": {"sample": 0, "mix": 1, "mix(temporarely)": 2}, "readonly": false, "cmd": "ts heaterselect"}, {"path": "heaterselect", "type": "enum", "enum": {"sample": 0, "mix": 1, "mix(temporarely)": 2}, "readonly": false, "cmd": "ts heaterselect"},
{"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": "control", "type": "enum", "enum": {"off": 0, "sample": 6, "mix": 5, "samplehtr": 8}, "readonly": false, "cmd": "ts control", "description": "click off to reload list"},
{"path": "heatermode", "type": "enum", "enum": {"disabled": -1, "off": 0, "on": 1}, "readonly": false, "cmd": "ts heatermode"}, {"path": "heatermode", "type": "enum", "enum": {"disabled": -1, "off": 0, "on": 1}, "readonly": false, "cmd": "ts heatermode"},
{"path": "heaterrange", "type": "enum", "enum": {"2uW": 1, "20uW": 2, "200uW": 3, "2mW": 4, "20mW": 5}, "readonly": false, "cmd": "ts heaterrange"}, {"path": "heaterrange", "type": "enum", "enum": {"off": 0, "2uW": 1, "20uW": 2, "200uW": 3, "2mW": 4, "20mW": 5}, "readonly": false, "cmd": "ts heaterrange"},
{"path": "autoheater", "type": "bool", "readonly": false, "cmd": "ts autoheater", "description": "automatic heater range", "kids": 12}, {"path": "autoheater", "type": "bool", "readonly": false, "cmd": "ts autoheater", "description": "automatic heater range", "kids": 12},
{"path": "autoheater/wlp0", "type": "float", "readonly": false, "cmd": "ts autoheater/wlp0", "description": "weak link base temperature (used for auto heater)"}, {"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/wlp1", "type": "float", "readonly": false, "cmd": "ts autoheater/wlp1", "description": "weak link temperature at 1 uW (used for auto heater)"},
@@ -292,7 +292,7 @@
{"path": "V3A", "type": "int", "readonly": false, "cmd": "dil V3A", "visibility": 3}, {"path": "V3A", "type": "int", "readonly": false, "cmd": "dil V3A", "visibility": 3},
{"path": "Roots", "type": "int", "readonly": false, "cmd": "dil Roots", "visibility": 3}, {"path": "Roots", "type": "int", "readonly": false, "cmd": "dil Roots", "visibility": 3},
{"path": "Aux", "type": "int", "readonly": false, "cmd": "dil Aux", "visibility": 3}, {"path": "Aux", "type": "int", "readonly": false, "cmd": "dil Aux", "visibility": 3},
{"path": "He3", "type": "int", "readonly": false, "cmd": "dil He3", "visibility": 3}, {"path": "He3", "type": "int", "readonly": false, "cmd": "dil He3"},
{"path": "closedelay", "type": "float", "readonly": false, "cmd": "dil closedelay", "visibility": 3}, {"path": "closedelay", "type": "float", "readonly": false, "cmd": "dil closedelay", "visibility": 3},
{"path": "extVersion", "type": "int", "readonly": false, "cmd": "dil extVersion", "visibility": 3}, {"path": "extVersion", "type": "int", "readonly": false, "cmd": "dil extVersion", "visibility": 3},
{"path": "pumpoff", "type": "int"}, {"path": "pumpoff", "type": "int"},

View File

@@ -18,7 +18,7 @@
{"path": "heaterselect", "type": "enum", "enum": {"sample": 0, "mix": 1, "mix(temporarely)": 2}, "readonly": false, "cmd": "ts heaterselect"}, {"path": "heaterselect", "type": "enum", "enum": {"sample": 0, "mix": 1, "mix(temporarely)": 2}, "readonly": false, "cmd": "ts heaterselect"},
{"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": "control", "type": "enum", "enum": {"off": 0, "sample": 6, "mix": 5, "samplehtr": 8}, "readonly": false, "cmd": "ts control", "description": "click off to reload list"},
{"path": "heatermode", "type": "enum", "enum": {"disabled": -1, "off": 0, "on": 1}, "readonly": false, "cmd": "ts heatermode"}, {"path": "heatermode", "type": "enum", "enum": {"disabled": -1, "off": 0, "on": 1}, "readonly": false, "cmd": "ts heatermode"},
{"path": "heaterrange", "type": "enum", "enum": {"2uW": 1, "20uW": 2, "200uW": 3, "2mW": 4, "20mW": 5}, "readonly": false, "cmd": "ts heaterrange"}, {"path": "heaterrange", "type": "enum", "enum": {"off": 0, "2uW": 1, "20uW": 2, "200uW": 3, "2mW": 4, "20mW": 5}, "readonly": false, "cmd": "ts heaterrange"},
{"path": "autoheater", "type": "bool", "readonly": false, "cmd": "ts autoheater", "description": "automatic heater range", "kids": 12}, {"path": "autoheater", "type": "bool", "readonly": false, "cmd": "ts autoheater", "description": "automatic heater range", "kids": 12},
{"path": "autoheater/wlp0", "type": "float", "readonly": false, "cmd": "ts autoheater/wlp0", "description": "weak link base temperature (used for auto heater)"}, {"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/wlp1", "type": "float", "readonly": false, "cmd": "ts autoheater/wlp1", "description": "weak link temperature at 1 uW (used for auto heater)"},
@@ -292,7 +292,7 @@
{"path": "V3A", "type": "int", "readonly": false, "cmd": "dil V3A", "visibility": 3}, {"path": "V3A", "type": "int", "readonly": false, "cmd": "dil V3A", "visibility": 3},
{"path": "Roots", "type": "int", "readonly": false, "cmd": "dil Roots", "visibility": 3}, {"path": "Roots", "type": "int", "readonly": false, "cmd": "dil Roots", "visibility": 3},
{"path": "Aux", "type": "int", "readonly": false, "cmd": "dil Aux", "visibility": 3}, {"path": "Aux", "type": "int", "readonly": false, "cmd": "dil Aux", "visibility": 3},
{"path": "He3", "type": "int", "readonly": false, "cmd": "dil He3", "visibility": 3}, {"path": "He3", "type": "int", "readonly": false, "cmd": "dil He3"},
{"path": "closedelay", "type": "float", "readonly": false, "cmd": "dil closedelay", "visibility": 3}, {"path": "closedelay", "type": "float", "readonly": false, "cmd": "dil closedelay", "visibility": 3},
{"path": "extVersion", "type": "int", "readonly": false, "cmd": "dil extVersion", "visibility": 3}, {"path": "extVersion", "type": "int", "readonly": false, "cmd": "dil extVersion", "visibility": 3},
{"path": "pumpoff", "type": "int"}, {"path": "pumpoff", "type": "int"},

View File

@@ -18,7 +18,7 @@
{"path": "heaterselect", "type": "enum", "enum": {"sample": 0, "mix": 1, "mix(temporarely)": 2}, "readonly": false, "cmd": "ts heaterselect"}, {"path": "heaterselect", "type": "enum", "enum": {"sample": 0, "mix": 1, "mix(temporarely)": 2}, "readonly": false, "cmd": "ts heaterselect"},
{"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": "control", "type": "enum", "enum": {"off": 0, "sample": 6, "mix": 5, "samplehtr": 8}, "readonly": false, "cmd": "ts control", "description": "click off to reload list"},
{"path": "heatermode", "type": "enum", "enum": {"disabled": -1, "off": 0, "on": 1}, "readonly": false, "cmd": "ts heatermode"}, {"path": "heatermode", "type": "enum", "enum": {"disabled": -1, "off": 0, "on": 1}, "readonly": false, "cmd": "ts heatermode"},
{"path": "heaterrange", "type": "enum", "enum": {"2uW": 1, "20uW": 2, "200uW": 3, "2mW": 4, "20mW": 5}, "readonly": false, "cmd": "ts heaterrange"}, {"path": "heaterrange", "type": "enum", "enum": {"off": 0, "2uW": 1, "20uW": 2, "200uW": 3, "2mW": 4, "20mW": 5}, "readonly": false, "cmd": "ts heaterrange"},
{"path": "autoheater", "type": "bool", "readonly": false, "cmd": "ts autoheater", "description": "automatic heater range", "kids": 12}, {"path": "autoheater", "type": "bool", "readonly": false, "cmd": "ts autoheater", "description": "automatic heater range", "kids": 12},
{"path": "autoheater/wlp0", "type": "float", "readonly": false, "cmd": "ts autoheater/wlp0", "description": "weak link base temperature (used for auto heater)"}, {"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/wlp1", "type": "float", "readonly": false, "cmd": "ts autoheater/wlp1", "description": "weak link temperature at 1 uW (used for auto heater)"},
@@ -292,7 +292,7 @@
{"path": "V3A", "type": "int", "readonly": false, "cmd": "dil V3A", "visibility": 3}, {"path": "V3A", "type": "int", "readonly": false, "cmd": "dil V3A", "visibility": 3},
{"path": "Roots", "type": "int", "readonly": false, "cmd": "dil Roots", "visibility": 3}, {"path": "Roots", "type": "int", "readonly": false, "cmd": "dil Roots", "visibility": 3},
{"path": "Aux", "type": "int", "readonly": false, "cmd": "dil Aux", "visibility": 3}, {"path": "Aux", "type": "int", "readonly": false, "cmd": "dil Aux", "visibility": 3},
{"path": "He3", "type": "int", "readonly": false, "cmd": "dil He3", "visibility": 3}, {"path": "He3", "type": "int", "readonly": false, "cmd": "dil He3"},
{"path": "closedelay", "type": "float", "readonly": false, "cmd": "dil closedelay", "visibility": 3}, {"path": "closedelay", "type": "float", "readonly": false, "cmd": "dil closedelay", "visibility": 3},
{"path": "extVersion", "type": "int", "readonly": false, "cmd": "dil extVersion", "visibility": 3}, {"path": "extVersion", "type": "int", "readonly": false, "cmd": "dil extVersion", "visibility": 3},
{"path": "pumpoff", "type": "int"}, {"path": "pumpoff", "type": "int"},

View File

@@ -3,7 +3,7 @@
{"path": "unit", "type": "text", "readonly": false, "cmd": "th unit", "visibility": 3}, {"path": "unit", "type": "text", "readonly": false, "cmd": "th unit", "visibility": 3},
{"path": "t2", "type": "float"}, {"path": "t2", "type": "float"},
{"path": "set", "type": "float"}, {"path": "set", "type": "float"},
{"path": "running", "type": "int", "readonly": false, "cmd": "th running", "visibility": 3}, {"path": "pumprunning", "type": "int", "readonly": false, "cmd": "th pumprunning"},
{"path": "extcontrol", "type": "int", "readonly": false, "cmd": "th extcontrol", "visibility": 3}, {"path": "extcontrol", "type": "int", "readonly": false, "cmd": "th extcontrol", "visibility": 3},
{"path": "relais", "type": "int", "visibility": 3}, {"path": "relais", "type": "int", "visibility": 3},
{"path": "overtemp", "type": "int", "visibility": 3}, {"path": "overtemp", "type": "int", "visibility": 3},

160
cfg/sea/haake2.config.json Normal file
View File

@@ -0,0 +1,160 @@
{"th": {"base": "/th", "params": [
{"path": "", "type": "float", "readonly": false, "cmd": "run th", "kids": 26},
{"path": "unit", "type": "text", "readonly": false, "cmd": "th unit", "visibility": 3},
{"path": "t2", "type": "float"},
{"path": "set", "type": "float"},
{"path": "pumprunning", "type": "int", "readonly": false, "cmd": "th pumprunning"},
{"path": "extcontrol", "type": "int", "readonly": false, "cmd": "th extcontrol", "visibility": 3},
{"path": "relais", "type": "int", "visibility": 3},
{"path": "overtemp", "type": "int", "visibility": 3},
{"path": "lowlevel", "type": "int", "visibility": 3},
{"path": "pumpalarm", "type": "int", "visibility": 3},
{"path": "externalarm", "type": "int", "visibility": 3},
{"path": "coolalarm", "type": "int", "visibility": 3},
{"path": "sensor1alarm", "type": "int", "visibility": 3},
{"path": "sensor2alarm", "type": "int", "visibility": 3},
{"path": "reset", "type": "int", "readonly": false, "cmd": "th reset", "visibility": 3},
{"path": "with2sensors", "type": "int", "readonly": false, "cmd": "th with2sensors", "visibility": 3},
{"path": "upperLimit", "type": "float", "readonly": false, "cmd": "th upperLimit"},
{"path": "lowerLimit", "type": "float", "readonly": false, "cmd": "th lowerLimit"},
{"path": "tolerance", "type": "float", "readonly": false, "cmd": "th tolerance"},
{"path": "maxwait", "type": "int", "readonly": false, "cmd": "th maxwait"},
{"path": "settle", "type": "int", "readonly": false, "cmd": "th settle"},
{"path": "targetValue", "type": "float"},
{"path": "is_running", "type": "int", "visibility": 3},
{"path": "verbose", "type": "int", "readonly": false, "cmd": "th verbose", "visibility": 3},
{"path": "driver", "type": "text", "visibility": 3},
{"path": "creationCmd", "type": "text", "visibility": 3},
{"path": "status", "type": "text", "readonly": false, "cmd": "th status"}]},
"te": {"base": "/te", "params": [
{"path": "", "type": "float", "readonly": false, "cmd": "run te", "kids": 30},
{"path": "unit", "type": "text", "readonly": false, "cmd": "te unit", "visibility": 3},
{"path": "mode", "type": "int", "readonly": false, "cmd": "te mode"},
{"path": "model", "type": "text", "visibility": 3},
{"path": "pbPow", "type": "float", "visibility": 3},
{"path": "pbMin", "type": "float", "visibility": 3},
{"path": "pbScl", "type": "float", "visibility": 3},
{"path": "output", "type": "float"},
{"path": "position", "type": "float", "readonly": false, "cmd": "te position"},
{"path": "asymmetry", "type": "float", "readonly": false, "cmd": "te asymmetry", "visibility": 3},
{"path": "range", "type": "float", "readonly": false, "cmd": "te range", "visibility": 3},
{"path": "set", "type": "float", "readonly": false, "cmd": "te set"},
{"path": "rdonly", "type": "int", "readonly": false, "cmd": "te rdonly", "visibility": 3},
{"path": "task", "type": "text", "readonly": false, "cmd": "te task"},
{"path": "upperLimit", "type": "float", "readonly": false, "cmd": "te upperLimit"},
{"path": "lowerLimit", "type": "float", "readonly": false, "cmd": "te lowerLimit", "visibility": 3},
{"path": "tolerance", "type": "float", "readonly": false, "cmd": "te tolerance"},
{"path": "maxwait", "type": "int", "readonly": false, "cmd": "te maxwait"},
{"path": "settle", "type": "int", "readonly": false, "cmd": "te settle"},
{"path": "targetValue", "type": "float"},
{"path": "is_running", "type": "int", "visibility": 3},
{"path": "verbose", "type": "int", "readonly": false, "cmd": "te verbose", "visibility": 3},
{"path": "driver", "type": "text", "visibility": 3},
{"path": "creationCmd", "type": "text", "visibility": 3},
{"path": "status", "type": "text", "readonly": false, "cmd": "te status"},
{"path": "pb", "type": "float", "readonly": false, "cmd": "te pb"},
{"path": "ti", "type": "float", "readonly": false, "cmd": "te ti"},
{"path": "td", "type": "float", "readonly": false, "cmd": "te td"},
{"path": "manual", "type": "float", "readonly": false, "cmd": "te manual"},
{"path": "rate", "type": "float", "readonly": false, "cmd": "te rate"},
{"path": "workset", "type": "float", "readonly": false, "cmd": "te workset"}]},
"cc": {"base": "/cc", "params": [
{"path": "", "type": "bool", "kids": 96},
{"path": "send", "type": "text", "readonly": false, "cmd": "cc send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3},
{"path": "autodevice", "type": "bool", "readonly": false, "cmd": "cc autodevice"},
{"path": "fav", "type": "bool", "readonly": false, "cmd": "cc fav"},
{"path": "f", "type": "float", "visibility": 3},
{"path": "fs", "type": "enum", "enum": {"ok": 0, "no_sens": 1}, "readonly": false, "cmd": "cc fs", "visibility": 3},
{"path": "mav", "type": "bool", "readonly": false, "cmd": "cc mav"},
{"path": "fm", "type": "enum", "enum": {"idle": 0, "opening": 1, "closing": 2, "opened": 3, "closed": 4, "no_motor": 5}, "visibility": 3},
{"path": "fa", "type": "enum", "enum": {"fixed": 0, "controlled": 1, "automatic": 2, "offline": 3}, "readonly": false, "cmd": "cc fa", "visibility": 3},
{"path": "mp", "type": "float", "readonly": false, "cmd": "cc mp", "visibility": 3},
{"path": "msp", "type": "float", "visibility": 3},
{"path": "mmp", "type": "float", "visibility": 3},
{"path": "mc", "type": "float", "readonly": false, "cmd": "cc mc", "visibility": 3},
{"path": "mfc", "type": "float", "readonly": false, "cmd": "cc mfc", "visibility": 3},
{"path": "moc", "type": "float", "readonly": false, "cmd": "cc moc", "visibility": 3},
{"path": "mtc", "type": "float", "readonly": false, "cmd": "cc mtc", "visibility": 3},
{"path": "mtl", "type": "float", "visibility": 3},
{"path": "mft", "type": "float", "readonly": false, "cmd": "cc mft", "visibility": 3},
{"path": "mt", "type": "float", "visibility": 3},
{"path": "mo", "type": "float", "visibility": 3},
{"path": "mcr", "type": "float", "visibility": 3},
{"path": "mot", "type": "float", "visibility": 3},
{"path": "mw", "type": "float", "readonly": false, "cmd": "cc mw", "description": "correction pulse after automatic open", "visibility": 3},
{"path": "hav", "type": "enum", "type": "enum", "enum": {"none": 0, "int": 1, "ext": 2}, "readonly": false, "cmd": "cc hav"},
{"path": "h", "type": "float", "visibility": 3},
{"path": "hr", "type": "float", "visibility": 3},
{"path": "hc", "type": "float", "visibility": 3},
{"path": "hu", "type": "float", "visibility": 3},
{"path": "hh", "type": "float", "readonly": false, "cmd": "cc hh", "visibility": 3},
{"path": "hl", "type": "float", "readonly": false, "cmd": "cc hl", "visibility": 3},
{"path": "htf", "type": "float", "readonly": false, "cmd": "cc htf", "description": "meas. period in fast mode", "visibility": 3},
{"path": "hts", "type": "float", "readonly": false, "cmd": "cc hts", "description": "meas. period in slow mode", "visibility": 3},
{"path": "hd", "type": "float", "readonly": false, "cmd": "cc hd", "visibility": 3},
{"path": "hwr", "type": "float", "readonly": false, "cmd": "cc hwr", "visibility": 3},
{"path": "hem", "type": "float", "readonly": false, "cmd": "cc hem", "description": "sensor length in mm from top to empty pos.", "visibility": 3},
{"path": "hfu", "type": "float", "readonly": false, "cmd": "cc hfu", "description": "sensor length in mm from top to full pos.", "visibility": 3},
{"path": "hcd", "type": "enum", "enum": {"stop": 0, "fill": 1, "off": 2, "auto": 3, "manual": 7}, "readonly": false, "cmd": "cc hcd", "visibility": 3},
{"path": "hv", "type": "enum", "enum": {"fill_valve_off": 0, "filling": 1, "no_fill_valve": 2, "timeout": 3, "timeout1": 4}, "visibility": 3},
{"path": "hsf", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3},
{"path": "ha", "type": "bool", "readonly": false, "cmd": "cc ha", "visibility": 3},
{"path": "hm", "type": "bool", "visibility": 3},
{"path": "hf", "type": "enum", "enum": {"slow": 0, "fast": 1}, "readonly": false, "cmd": "cc hf", "visibility": 3},
{"path": "hbe", "type": "bool", "readonly": false, "cmd": "cc hbe", "visibility": 3},
{"path": "hmf", "type": "float", "visibility": 3},
{"path": "hms", "type": "float", "visibility": 3},
{"path": "hit", "type": "float", "readonly": false, "cmd": "cc hit", "visibility": 3},
{"path": "hft", "type": "int", "readonly": false, "cmd": "cc hft", "visibility": 3},
{"path": "hea", "type": "enum", "enum": {"0": 0, "1": 1, "6": 6}, "readonly": false, "cmd": "cc hea"},
{"path": "hch", "type": "int", "readonly": false, "cmd": "cc hch", "visibility": 3},
{"path": "hwr0", "type": "float", "readonly": false, "cmd": "cc hwr0", "visibility": 3},
{"path": "hem0", "type": "float", "readonly": false, "cmd": "cc hem0", "description": "sensor length in mm from top to empty pos.", "visibility": 3},
{"path": "hfu0", "type": "float", "readonly": false, "cmd": "cc hfu0", "description": "sensor length in mm from top to full pos.", "visibility": 3},
{"path": "hd0", "type": "float", "readonly": false, "cmd": "cc hd0", "description": "external sensor drive current (mA)", "visibility": 3},
{"path": "h0", "type": "float", "visibility": 3},
{"path": "hs0", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3},
{"path": "h1", "type": "float", "visibility": 3},
{"path": "hs1", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3},
{"path": "h2", "type": "float", "visibility": 3},
{"path": "hs2", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3},
{"path": "h3", "type": "float", "visibility": 3},
{"path": "hs3", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3},
{"path": "h4", "type": "float", "visibility": 3},
{"path": "hs4", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3},
{"path": "h5", "type": "float", "visibility": 3},
{"path": "hs5", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3},
{"path": "hfb", "type": "float", "visibility": 3},
{"path": "nav", "type": "enum", "type": "enum", "enum": {"none": 0, "int": 1, "ext": 2}, "readonly": false, "cmd": "cc nav"},
{"path": "nu", "type": "float", "visibility": 3},
{"path": "nl", "type": "float", "visibility": 3},
{"path": "nth", "type": "float", "readonly": false, "cmd": "cc nth", "visibility": 3},
{"path": "ntc", "type": "float", "readonly": false, "cmd": "cc ntc", "visibility": 3},
{"path": "ntm", "type": "float", "readonly": false, "cmd": "cc ntm", "visibility": 3},
{"path": "ns", "type": "enum", "enum": {"sens_ok": 0, "no_sens": 1, "short_circuit": 2, "upside_down": 3, "sens_warm": 4, "empty": 5}, "visibility": 3},
{"path": "na", "type": "bool", "readonly": false, "cmd": "cc na", "visibility": 3},
{"path": "nv", "type": "enum", "enum": {"fill_valve_off": 0, "filling": 1, "no_fill_valve": 2, "timeout": 3, "timeout1": 4, "boost": 5}, "visibility": 3},
{"path": "nc", "type": "enum", "enum": {"stop": 0, "fill": 1, "off": 2, "auto": 3}, "readonly": false, "cmd": "cc nc", "visibility": 3},
{"path": "nfb", "type": "float", "visibility": 3},
{"path": "cda", "type": "float"},
{"path": "cdb", "type": "float"},
{"path": "cba", "type": "float"},
{"path": "cbb", "type": "float"},
{"path": "cvs", "type": "int"},
{"path": "csp", "type": "int"},
{"path": "cdv", "type": "text", "readonly": false, "cmd": "cc cdv"},
{"path": "cic", "type": "text", "readonly": false, "cmd": "cc cic"},
{"path": "cin", "type": "text"},
{"path": "cds", "type": "enum", "enum": {"local": 0, "remote": 1, "loading": 2, "by_code": 3, "by_touch": 4}, "readonly": false, "cmd": "cc cds"},
{"path": "timing", "type": "bool", "readonly": false, "cmd": "cc timing"},
{"path": "tc", "type": "float", "visibility": 3},
{"path": "tn", "type": "float", "visibility": 3},
{"path": "th", "type": "float", "visibility": 3},
{"path": "tf", "type": "float", "visibility": 3},
{"path": "tm", "type": "float", "visibility": 3},
{"path": "tv", "type": "float", "visibility": 3},
{"path": "tq", "type": "float", "visibility": 3},
{"path": "bdl", "type": "float", "readonly": false, "cmd": "cc bdl"}]}}

213
cfg/sea/leiden.config.json Normal file
View File

@@ -0,0 +1,213 @@
{"tt": {"base": "/tt", "params": [
{"path": "", "type": "int", "kids": 18},
{"path": "send", "type": "text", "readonly": false, "cmd": "tt send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3},
{"path": "autoscan", "type": "bool", "readonly": false, "cmd": "tt autoscan", "kids": 4},
{"path": "autoscan/synchronized", "type": "bool", "readonly": false, "cmd": "tt autoscan/synchronized"},
{"path": "autoscan/interval", "type": "text", "readonly": false, "cmd": "tt autoscan/interval"},
{"path": "autoscan/pause", "type": "text", "readonly": false, "cmd": "tt autoscan/pause"},
{"path": "autoscan/dwell", "type": "text", "readonly": false, "cmd": "tt autoscan/dwell"},
{"path": "T3K", "type": "float", "kids": 14},
{"path": "T3K/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt T3K/active"},
{"path": "T3K/autorange", "type": "bool", "readonly": false, "cmd": "tt T3K/autorange", "description": "autorange (common for all channels)"},
{"path": "T3K/range", "type": "text", "readonly": false, "cmd": "tt T3K/range", "description": "resistance range in Ohm"},
{"path": "T3K/range_num", "type": "int"},
{"path": "T3K/excitation", "type": "text", "readonly": false, "cmd": "tt T3K/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "T3K/excitation_num", "type": "int"},
{"path": "T3K/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "T3K/pause", "type": "int", "readonly": false, "cmd": "tt T3K/pause", "description": "pause time [sec] after channel change"},
{"path": "T3K/filter", "type": "int", "readonly": false, "cmd": "tt T3K/filter", "description": "filter average time [sec]"},
{"path": "T3K/dwell", "type": "int", "readonly": false, "cmd": "tt T3K/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "T3K/status", "type": "text"},
{"path": "T3K/curve", "type": "text", "readonly": false, "cmd": "tt T3K/curve", "kids": 1},
{"path": "T3K/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt T3K/curve/points", "visibility": 3},
{"path": "T3K/alarm", "type": "float", "readonly": false, "cmd": "tt T3K/alarm"},
{"path": "T3K/raw", "type": "float"},
{"path": "Tstill", "type": "float", "kids": 14},
{"path": "Tstill/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tstill/active"},
{"path": "Tstill/autorange", "type": "bool", "readonly": false, "cmd": "tt Tstill/autorange", "description": "autorange (common for all channels)"},
{"path": "Tstill/range", "type": "text", "readonly": false, "cmd": "tt Tstill/range", "description": "resistance range in Ohm"},
{"path": "Tstill/range_num", "type": "int"},
{"path": "Tstill/excitation", "type": "text", "readonly": false, "cmd": "tt Tstill/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tstill/excitation_num", "type": "int"},
{"path": "Tstill/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tstill/pause", "type": "int", "readonly": false, "cmd": "tt Tstill/pause", "description": "pause time [sec] after channel change"},
{"path": "Tstill/filter", "type": "int", "readonly": false, "cmd": "tt Tstill/filter", "description": "filter average time [sec]"},
{"path": "Tstill/dwell", "type": "int", "readonly": false, "cmd": "tt Tstill/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tstill/status", "type": "text"},
{"path": "Tstill/curve", "type": "text", "readonly": false, "cmd": "tt Tstill/curve", "kids": 1},
{"path": "Tstill/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tstill/curve/points", "visibility": 3},
{"path": "Tstill/alarm", "type": "float", "readonly": false, "cmd": "tt Tstill/alarm"},
{"path": "Tstill/raw", "type": "float"},
{"path": "T50mK", "type": "float", "kids": 14},
{"path": "T50mK/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt T50mK/active"},
{"path": "T50mK/autorange", "type": "bool", "readonly": false, "cmd": "tt T50mK/autorange", "description": "autorange (common for all channels)"},
{"path": "T50mK/range", "type": "text", "readonly": false, "cmd": "tt T50mK/range", "description": "resistance range in Ohm"},
{"path": "T50mK/range_num", "type": "int"},
{"path": "T50mK/excitation", "type": "text", "readonly": false, "cmd": "tt T50mK/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "T50mK/excitation_num", "type": "int"},
{"path": "T50mK/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "T50mK/pause", "type": "int", "readonly": false, "cmd": "tt T50mK/pause", "description": "pause time [sec] after channel change"},
{"path": "T50mK/filter", "type": "int", "readonly": false, "cmd": "tt T50mK/filter", "description": "filter average time [sec]"},
{"path": "T50mK/dwell", "type": "int", "readonly": false, "cmd": "tt T50mK/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "T50mK/status", "type": "text"},
{"path": "T50mK/curve", "type": "text", "readonly": false, "cmd": "tt T50mK/curve", "kids": 1},
{"path": "T50mK/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt T50mK/curve/points", "visibility": 3},
{"path": "T50mK/alarm", "type": "float", "readonly": false, "cmd": "tt T50mK/alarm"},
{"path": "T50mK/raw", "type": "float"},
{"path": "Tmxlow", "type": "float", "kids": 14},
{"path": "Tmxlow/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tmxlow/active"},
{"path": "Tmxlow/autorange", "type": "bool", "readonly": false, "cmd": "tt Tmxlow/autorange", "description": "autorange (common for all channels)"},
{"path": "Tmxlow/range", "type": "text", "readonly": false, "cmd": "tt Tmxlow/range", "description": "resistance range in Ohm"},
{"path": "Tmxlow/range_num", "type": "int"},
{"path": "Tmxlow/excitation", "type": "text", "readonly": false, "cmd": "tt Tmxlow/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tmxlow/excitation_num", "type": "int"},
{"path": "Tmxlow/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tmxlow/pause", "type": "int", "readonly": false, "cmd": "tt Tmxlow/pause", "description": "pause time [sec] after channel change"},
{"path": "Tmxlow/filter", "type": "int", "readonly": false, "cmd": "tt Tmxlow/filter", "description": "filter average time [sec]"},
{"path": "Tmxlow/dwell", "type": "int", "readonly": false, "cmd": "tt Tmxlow/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tmxlow/status", "type": "text"},
{"path": "Tmxlow/curve", "type": "text", "readonly": false, "cmd": "tt Tmxlow/curve", "kids": 1},
{"path": "Tmxlow/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tmxlow/curve/points", "visibility": 3},
{"path": "Tmxlow/alarm", "type": "float", "readonly": false, "cmd": "tt Tmxlow/alarm"},
{"path": "Tmxlow/raw", "type": "float"},
{"path": "Tmxhigh", "type": "float", "kids": 14},
{"path": "Tmxhigh/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tmxhigh/active"},
{"path": "Tmxhigh/autorange", "type": "bool", "readonly": false, "cmd": "tt Tmxhigh/autorange", "description": "autorange (common for all channels)"},
{"path": "Tmxhigh/range", "type": "text", "readonly": false, "cmd": "tt Tmxhigh/range", "description": "resistance range in Ohm"},
{"path": "Tmxhigh/range_num", "type": "int"},
{"path": "Tmxhigh/excitation", "type": "text", "readonly": false, "cmd": "tt Tmxhigh/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tmxhigh/excitation_num", "type": "int"},
{"path": "Tmxhigh/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tmxhigh/pause", "type": "int", "readonly": false, "cmd": "tt Tmxhigh/pause", "description": "pause time [sec] after channel change"},
{"path": "Tmxhigh/filter", "type": "int", "readonly": false, "cmd": "tt Tmxhigh/filter", "description": "filter average time [sec]"},
{"path": "Tmxhigh/dwell", "type": "int", "readonly": false, "cmd": "tt Tmxhigh/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tmxhigh/status", "type": "text"},
{"path": "Tmxhigh/curve", "type": "text", "readonly": false, "cmd": "tt Tmxhigh/curve", "kids": 1},
{"path": "Tmxhigh/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tmxhigh/curve/points", "visibility": 3},
{"path": "Tmxhigh/alarm", "type": "float", "readonly": false, "cmd": "tt Tmxhigh/alarm"},
{"path": "Tmxhigh/raw", "type": "float"},
{"path": "Tmxcx", "type": "float", "kids": 14},
{"path": "Tmxcx/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tmxcx/active"},
{"path": "Tmxcx/autorange", "type": "bool", "readonly": false, "cmd": "tt Tmxcx/autorange", "description": "autorange (common for all channels)"},
{"path": "Tmxcx/range", "type": "text", "readonly": false, "cmd": "tt Tmxcx/range", "description": "resistance range in Ohm"},
{"path": "Tmxcx/range_num", "type": "int"},
{"path": "Tmxcx/excitation", "type": "text", "readonly": false, "cmd": "tt Tmxcx/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tmxcx/excitation_num", "type": "int"},
{"path": "Tmxcx/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tmxcx/pause", "type": "int", "readonly": false, "cmd": "tt Tmxcx/pause", "description": "pause time [sec] after channel change"},
{"path": "Tmxcx/filter", "type": "int", "readonly": false, "cmd": "tt Tmxcx/filter", "description": "filter average time [sec]"},
{"path": "Tmxcx/dwell", "type": "int", "readonly": false, "cmd": "tt Tmxcx/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tmxcx/status", "type": "text"},
{"path": "Tmxcx/curve", "type": "text", "readonly": false, "cmd": "tt Tmxcx/curve", "kids": 1},
{"path": "Tmxcx/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tmxcx/curve/points", "visibility": 3},
{"path": "Tmxcx/alarm", "type": "float", "readonly": false, "cmd": "tt Tmxcx/alarm"},
{"path": "Tmxcx/raw", "type": "float"},
{"path": "Tblueo", "type": "float", "kids": 14},
{"path": "Tblueo/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tblueo/active"},
{"path": "Tblueo/autorange", "type": "bool", "readonly": false, "cmd": "tt Tblueo/autorange", "description": "autorange (common for all channels)"},
{"path": "Tblueo/range", "type": "text", "readonly": false, "cmd": "tt Tblueo/range", "description": "resistance range in Ohm"},
{"path": "Tblueo/range_num", "type": "int"},
{"path": "Tblueo/excitation", "type": "text", "readonly": false, "cmd": "tt Tblueo/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tblueo/excitation_num", "type": "int"},
{"path": "Tblueo/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tblueo/pause", "type": "int", "readonly": false, "cmd": "tt Tblueo/pause", "description": "pause time [sec] after channel change"},
{"path": "Tblueo/filter", "type": "int", "readonly": false, "cmd": "tt Tblueo/filter", "description": "filter average time [sec]"},
{"path": "Tblueo/dwell", "type": "int", "readonly": false, "cmd": "tt Tblueo/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tblueo/status", "type": "text"},
{"path": "Tblueo/curve", "type": "text", "readonly": false, "cmd": "tt Tblueo/curve", "kids": 1},
{"path": "Tblueo/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tblueo/curve/points", "visibility": 3},
{"path": "Tblueo/alarm", "type": "float", "readonly": false, "cmd": "tt Tblueo/alarm"},
{"path": "Tblueo/raw", "type": "float"},
{"path": "Tpt50", "type": "float", "kids": 14},
{"path": "Tpt50/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tpt50/active"},
{"path": "Tpt50/autorange", "type": "bool", "readonly": false, "cmd": "tt Tpt50/autorange", "description": "autorange (common for all channels)"},
{"path": "Tpt50/range", "type": "text", "readonly": false, "cmd": "tt Tpt50/range", "description": "resistance range in Ohm"},
{"path": "Tpt50/range_num", "type": "int"},
{"path": "Tpt50/excitation", "type": "text", "readonly": false, "cmd": "tt Tpt50/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tpt50/excitation_num", "type": "int"},
{"path": "Tpt50/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tpt50/pause", "type": "int", "readonly": false, "cmd": "tt Tpt50/pause", "description": "pause time [sec] after channel change"},
{"path": "Tpt50/filter", "type": "int", "readonly": false, "cmd": "tt Tpt50/filter", "description": "filter average time [sec]"},
{"path": "Tpt50/dwell", "type": "int", "readonly": false, "cmd": "tt Tpt50/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tpt50/status", "type": "text"},
{"path": "Tpt50/curve", "type": "text", "readonly": false, "cmd": "tt Tpt50/curve", "kids": 1},
{"path": "Tpt50/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tpt50/curve/points", "visibility": 3},
{"path": "Tpt50/alarm", "type": "float", "readonly": false, "cmd": "tt Tpt50/alarm"},
{"path": "Tpt50/raw", "type": "float"},
{"path": "Tpt3high", "type": "float", "kids": 14},
{"path": "Tpt3high/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tpt3high/active"},
{"path": "Tpt3high/autorange", "type": "bool", "readonly": false, "cmd": "tt Tpt3high/autorange", "description": "autorange (common for all channels)"},
{"path": "Tpt3high/range", "type": "text", "readonly": false, "cmd": "tt Tpt3high/range", "description": "resistance range in Ohm"},
{"path": "Tpt3high/range_num", "type": "int"},
{"path": "Tpt3high/excitation", "type": "text", "readonly": false, "cmd": "tt Tpt3high/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tpt3high/excitation_num", "type": "int"},
{"path": "Tpt3high/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tpt3high/pause", "type": "int", "readonly": false, "cmd": "tt Tpt3high/pause", "description": "pause time [sec] after channel change"},
{"path": "Tpt3high/filter", "type": "int", "readonly": false, "cmd": "tt Tpt3high/filter", "description": "filter average time [sec]"},
{"path": "Tpt3high/dwell", "type": "int", "readonly": false, "cmd": "tt Tpt3high/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tpt3high/status", "type": "text"},
{"path": "Tpt3high/curve", "type": "text", "readonly": false, "cmd": "tt Tpt3high/curve", "kids": 1},
{"path": "Tpt3high/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tpt3high/curve/points", "visibility": 3},
{"path": "Tpt3high/alarm", "type": "float", "readonly": false, "cmd": "tt Tpt3high/alarm"},
{"path": "Tpt3high/raw", "type": "float"},
{"path": "Tpt3low", "type": "float", "kids": 14},
{"path": "Tpt3low/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tpt3low/active"},
{"path": "Tpt3low/autorange", "type": "bool", "readonly": false, "cmd": "tt Tpt3low/autorange", "description": "autorange (common for all channels)"},
{"path": "Tpt3low/range", "type": "text", "readonly": false, "cmd": "tt Tpt3low/range", "description": "resistance range in Ohm"},
{"path": "Tpt3low/range_num", "type": "int"},
{"path": "Tpt3low/excitation", "type": "text", "readonly": false, "cmd": "tt Tpt3low/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tpt3low/excitation_num", "type": "int"},
{"path": "Tpt3low/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tpt3low/pause", "type": "int", "readonly": false, "cmd": "tt Tpt3low/pause", "description": "pause time [sec] after channel change"},
{"path": "Tpt3low/filter", "type": "int", "readonly": false, "cmd": "tt Tpt3low/filter", "description": "filter average time [sec]"},
{"path": "Tpt3low/dwell", "type": "int", "readonly": false, "cmd": "tt Tpt3low/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tpt3low/status", "type": "text"},
{"path": "Tpt3low/curve", "type": "text", "readonly": false, "cmd": "tt Tpt3low/curve", "kids": 1},
{"path": "Tpt3low/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tpt3low/curve/points", "visibility": 3},
{"path": "Tpt3low/alarm", "type": "float", "readonly": false, "cmd": "tt Tpt3low/alarm"},
{"path": "Tpt3low/raw", "type": "float"},
{"path": "Twhite", "type": "float", "kids": 14},
{"path": "Twhite/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Twhite/active"},
{"path": "Twhite/autorange", "type": "bool", "readonly": false, "cmd": "tt Twhite/autorange", "description": "autorange (common for all channels)"},
{"path": "Twhite/range", "type": "text", "readonly": false, "cmd": "tt Twhite/range", "description": "resistance range in Ohm"},
{"path": "Twhite/range_num", "type": "int"},
{"path": "Twhite/excitation", "type": "text", "readonly": false, "cmd": "tt Twhite/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Twhite/excitation_num", "type": "int"},
{"path": "Twhite/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Twhite/pause", "type": "int", "readonly": false, "cmd": "tt Twhite/pause", "description": "pause time [sec] after channel change"},
{"path": "Twhite/filter", "type": "int", "readonly": false, "cmd": "tt Twhite/filter", "description": "filter average time [sec]"},
{"path": "Twhite/dwell", "type": "int", "readonly": false, "cmd": "tt Twhite/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Twhite/status", "type": "text"},
{"path": "Twhite/curve", "type": "text", "readonly": false, "cmd": "tt Twhite/curve", "kids": 1},
{"path": "Twhite/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Twhite/curve/points", "visibility": 3},
{"path": "Twhite/alarm", "type": "float", "readonly": false, "cmd": "tt Twhite/alarm"},
{"path": "Twhite/raw", "type": "float"},
{"path": "Tgreen", "type": "float", "kids": 14},
{"path": "Tgreen/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tgreen/active"},
{"path": "Tgreen/autorange", "type": "bool", "readonly": false, "cmd": "tt Tgreen/autorange", "description": "autorange (common for all channels)"},
{"path": "Tgreen/range", "type": "text", "readonly": false, "cmd": "tt Tgreen/range", "description": "resistance range in Ohm"},
{"path": "Tgreen/range_num", "type": "int"},
{"path": "Tgreen/excitation", "type": "text", "readonly": false, "cmd": "tt Tgreen/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tgreen/excitation_num", "type": "int"},
{"path": "Tgreen/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tgreen/pause", "type": "int", "readonly": false, "cmd": "tt Tgreen/pause", "description": "pause time [sec] after channel change"},
{"path": "Tgreen/filter", "type": "int", "readonly": false, "cmd": "tt Tgreen/filter", "description": "filter average time [sec]"},
{"path": "Tgreen/dwell", "type": "int", "readonly": false, "cmd": "tt Tgreen/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tgreen/status", "type": "text"},
{"path": "Tgreen/curve", "type": "text", "readonly": false, "cmd": "tt Tgreen/curve", "kids": 1},
{"path": "Tgreen/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tgreen/curve/points", "visibility": 3},
{"path": "Tgreen/alarm", "type": "float", "readonly": false, "cmd": "tt Tgreen/alarm"},
{"path": "Tgreen/raw", "type": "float"},
{"path": "analog2", "type": "float", "readonly": false, "cmd": "tt analog2"},
{"path": "remote", "type": "bool"},
{"path": "display", "type": "text", "readonly": false, "cmd": "tt display"}]},
"cmn": {"base": "/cmn", "params": [
{"path": "", "type": "none", "kids": 6},
{"path": "send", "type": "text", "readonly": false, "cmd": "cmn send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3},
{"path": "u1", "type": "float"},
{"path": "temp", "type": "float"},
{"path": "u2", "type": "float"},
{"path": "chan", "type": "enum", "enum": {"auto": 0, "chan1": 1, "chan2": 2}, "readonly": false, "cmd": "cmn chan"}]}}

View File

@@ -0,0 +1,213 @@
{"tt": {"base": "/tt", "params": [
{"path": "", "type": "int", "kids": 18},
{"path": "send", "type": "text", "readonly": false, "cmd": "tt send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3},
{"path": "autoscan", "type": "bool", "readonly": false, "cmd": "tt autoscan", "kids": 4},
{"path": "autoscan/synchronized", "type": "bool", "readonly": false, "cmd": "tt autoscan/synchronized"},
{"path": "autoscan/interval", "type": "text", "readonly": false, "cmd": "tt autoscan/interval"},
{"path": "autoscan/pause", "type": "text", "readonly": false, "cmd": "tt autoscan/pause"},
{"path": "autoscan/dwell", "type": "text", "readonly": false, "cmd": "tt autoscan/dwell"},
{"path": "T3K", "type": "float", "kids": 14},
{"path": "T3K/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt T3K/active"},
{"path": "T3K/autorange", "type": "bool", "readonly": false, "cmd": "tt T3K/autorange", "description": "autorange (common for all channels)"},
{"path": "T3K/range", "type": "text", "readonly": false, "cmd": "tt T3K/range", "description": "resistance range in Ohm"},
{"path": "T3K/range_num", "type": "int"},
{"path": "T3K/excitation", "type": "text", "readonly": false, "cmd": "tt T3K/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "T3K/excitation_num", "type": "int"},
{"path": "T3K/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "T3K/pause", "type": "int", "readonly": false, "cmd": "tt T3K/pause", "description": "pause time [sec] after channel change"},
{"path": "T3K/filter", "type": "int", "readonly": false, "cmd": "tt T3K/filter", "description": "filter average time [sec]"},
{"path": "T3K/dwell", "type": "int", "readonly": false, "cmd": "tt T3K/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "T3K/status", "type": "text"},
{"path": "T3K/curve", "type": "text", "readonly": false, "cmd": "tt T3K/curve", "kids": 1},
{"path": "T3K/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt T3K/curve/points", "visibility": 3},
{"path": "T3K/alarm", "type": "float", "readonly": false, "cmd": "tt T3K/alarm"},
{"path": "T3K/raw", "type": "float"},
{"path": "Tstill", "type": "float", "kids": 14},
{"path": "Tstill/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tstill/active"},
{"path": "Tstill/autorange", "type": "bool", "readonly": false, "cmd": "tt Tstill/autorange", "description": "autorange (common for all channels)"},
{"path": "Tstill/range", "type": "text", "readonly": false, "cmd": "tt Tstill/range", "description": "resistance range in Ohm"},
{"path": "Tstill/range_num", "type": "int"},
{"path": "Tstill/excitation", "type": "text", "readonly": false, "cmd": "tt Tstill/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tstill/excitation_num", "type": "int"},
{"path": "Tstill/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tstill/pause", "type": "int", "readonly": false, "cmd": "tt Tstill/pause", "description": "pause time [sec] after channel change"},
{"path": "Tstill/filter", "type": "int", "readonly": false, "cmd": "tt Tstill/filter", "description": "filter average time [sec]"},
{"path": "Tstill/dwell", "type": "int", "readonly": false, "cmd": "tt Tstill/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tstill/status", "type": "text"},
{"path": "Tstill/curve", "type": "text", "readonly": false, "cmd": "tt Tstill/curve", "kids": 1},
{"path": "Tstill/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tstill/curve/points", "visibility": 3},
{"path": "Tstill/alarm", "type": "float", "readonly": false, "cmd": "tt Tstill/alarm"},
{"path": "Tstill/raw", "type": "float"},
{"path": "T50mK", "type": "float", "kids": 14},
{"path": "T50mK/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt T50mK/active"},
{"path": "T50mK/autorange", "type": "bool", "readonly": false, "cmd": "tt T50mK/autorange", "description": "autorange (common for all channels)"},
{"path": "T50mK/range", "type": "text", "readonly": false, "cmd": "tt T50mK/range", "description": "resistance range in Ohm"},
{"path": "T50mK/range_num", "type": "int"},
{"path": "T50mK/excitation", "type": "text", "readonly": false, "cmd": "tt T50mK/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "T50mK/excitation_num", "type": "int"},
{"path": "T50mK/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "T50mK/pause", "type": "int", "readonly": false, "cmd": "tt T50mK/pause", "description": "pause time [sec] after channel change"},
{"path": "T50mK/filter", "type": "int", "readonly": false, "cmd": "tt T50mK/filter", "description": "filter average time [sec]"},
{"path": "T50mK/dwell", "type": "int", "readonly": false, "cmd": "tt T50mK/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "T50mK/status", "type": "text"},
{"path": "T50mK/curve", "type": "text", "readonly": false, "cmd": "tt T50mK/curve", "kids": 1},
{"path": "T50mK/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt T50mK/curve/points", "visibility": 3},
{"path": "T50mK/alarm", "type": "float", "readonly": false, "cmd": "tt T50mK/alarm"},
{"path": "T50mK/raw", "type": "float"},
{"path": "Tmxlow", "type": "float", "kids": 14},
{"path": "Tmxlow/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tmxlow/active"},
{"path": "Tmxlow/autorange", "type": "bool", "readonly": false, "cmd": "tt Tmxlow/autorange", "description": "autorange (common for all channels)"},
{"path": "Tmxlow/range", "type": "text", "readonly": false, "cmd": "tt Tmxlow/range", "description": "resistance range in Ohm"},
{"path": "Tmxlow/range_num", "type": "int"},
{"path": "Tmxlow/excitation", "type": "text", "readonly": false, "cmd": "tt Tmxlow/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tmxlow/excitation_num", "type": "int"},
{"path": "Tmxlow/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tmxlow/pause", "type": "int", "readonly": false, "cmd": "tt Tmxlow/pause", "description": "pause time [sec] after channel change"},
{"path": "Tmxlow/filter", "type": "int", "readonly": false, "cmd": "tt Tmxlow/filter", "description": "filter average time [sec]"},
{"path": "Tmxlow/dwell", "type": "int", "readonly": false, "cmd": "tt Tmxlow/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tmxlow/status", "type": "text"},
{"path": "Tmxlow/curve", "type": "text", "readonly": false, "cmd": "tt Tmxlow/curve", "kids": 1},
{"path": "Tmxlow/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tmxlow/curve/points", "visibility": 3},
{"path": "Tmxlow/alarm", "type": "float", "readonly": false, "cmd": "tt Tmxlow/alarm"},
{"path": "Tmxlow/raw", "type": "float"},
{"path": "Tmxhigh", "type": "float", "kids": 14},
{"path": "Tmxhigh/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tmxhigh/active"},
{"path": "Tmxhigh/autorange", "type": "bool", "readonly": false, "cmd": "tt Tmxhigh/autorange", "description": "autorange (common for all channels)"},
{"path": "Tmxhigh/range", "type": "text", "readonly": false, "cmd": "tt Tmxhigh/range", "description": "resistance range in Ohm"},
{"path": "Tmxhigh/range_num", "type": "int"},
{"path": "Tmxhigh/excitation", "type": "text", "readonly": false, "cmd": "tt Tmxhigh/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tmxhigh/excitation_num", "type": "int"},
{"path": "Tmxhigh/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tmxhigh/pause", "type": "int", "readonly": false, "cmd": "tt Tmxhigh/pause", "description": "pause time [sec] after channel change"},
{"path": "Tmxhigh/filter", "type": "int", "readonly": false, "cmd": "tt Tmxhigh/filter", "description": "filter average time [sec]"},
{"path": "Tmxhigh/dwell", "type": "int", "readonly": false, "cmd": "tt Tmxhigh/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tmxhigh/status", "type": "text"},
{"path": "Tmxhigh/curve", "type": "text", "readonly": false, "cmd": "tt Tmxhigh/curve", "kids": 1},
{"path": "Tmxhigh/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tmxhigh/curve/points", "visibility": 3},
{"path": "Tmxhigh/alarm", "type": "float", "readonly": false, "cmd": "tt Tmxhigh/alarm"},
{"path": "Tmxhigh/raw", "type": "float"},
{"path": "Tmxcx", "type": "float", "kids": 14},
{"path": "Tmxcx/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tmxcx/active"},
{"path": "Tmxcx/autorange", "type": "bool", "readonly": false, "cmd": "tt Tmxcx/autorange", "description": "autorange (common for all channels)"},
{"path": "Tmxcx/range", "type": "text", "readonly": false, "cmd": "tt Tmxcx/range", "description": "resistance range in Ohm"},
{"path": "Tmxcx/range_num", "type": "int"},
{"path": "Tmxcx/excitation", "type": "text", "readonly": false, "cmd": "tt Tmxcx/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tmxcx/excitation_num", "type": "int"},
{"path": "Tmxcx/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tmxcx/pause", "type": "int", "readonly": false, "cmd": "tt Tmxcx/pause", "description": "pause time [sec] after channel change"},
{"path": "Tmxcx/filter", "type": "int", "readonly": false, "cmd": "tt Tmxcx/filter", "description": "filter average time [sec]"},
{"path": "Tmxcx/dwell", "type": "int", "readonly": false, "cmd": "tt Tmxcx/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tmxcx/status", "type": "text"},
{"path": "Tmxcx/curve", "type": "text", "readonly": false, "cmd": "tt Tmxcx/curve", "kids": 1},
{"path": "Tmxcx/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tmxcx/curve/points", "visibility": 3},
{"path": "Tmxcx/alarm", "type": "float", "readonly": false, "cmd": "tt Tmxcx/alarm"},
{"path": "Tmxcx/raw", "type": "float"},
{"path": "Tblueo", "type": "float", "kids": 14},
{"path": "Tblueo/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tblueo/active"},
{"path": "Tblueo/autorange", "type": "bool", "readonly": false, "cmd": "tt Tblueo/autorange", "description": "autorange (common for all channels)"},
{"path": "Tblueo/range", "type": "text", "readonly": false, "cmd": "tt Tblueo/range", "description": "resistance range in Ohm"},
{"path": "Tblueo/range_num", "type": "int"},
{"path": "Tblueo/excitation", "type": "text", "readonly": false, "cmd": "tt Tblueo/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tblueo/excitation_num", "type": "int"},
{"path": "Tblueo/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tblueo/pause", "type": "int", "readonly": false, "cmd": "tt Tblueo/pause", "description": "pause time [sec] after channel change"},
{"path": "Tblueo/filter", "type": "int", "readonly": false, "cmd": "tt Tblueo/filter", "description": "filter average time [sec]"},
{"path": "Tblueo/dwell", "type": "int", "readonly": false, "cmd": "tt Tblueo/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tblueo/status", "type": "text"},
{"path": "Tblueo/curve", "type": "text", "readonly": false, "cmd": "tt Tblueo/curve", "kids": 1},
{"path": "Tblueo/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tblueo/curve/points", "visibility": 3},
{"path": "Tblueo/alarm", "type": "float", "readonly": false, "cmd": "tt Tblueo/alarm"},
{"path": "Tblueo/raw", "type": "float"},
{"path": "Tpt50", "type": "float", "kids": 14},
{"path": "Tpt50/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tpt50/active"},
{"path": "Tpt50/autorange", "type": "bool", "readonly": false, "cmd": "tt Tpt50/autorange", "description": "autorange (common for all channels)"},
{"path": "Tpt50/range", "type": "text", "readonly": false, "cmd": "tt Tpt50/range", "description": "resistance range in Ohm"},
{"path": "Tpt50/range_num", "type": "int"},
{"path": "Tpt50/excitation", "type": "text", "readonly": false, "cmd": "tt Tpt50/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tpt50/excitation_num", "type": "int"},
{"path": "Tpt50/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tpt50/pause", "type": "int", "readonly": false, "cmd": "tt Tpt50/pause", "description": "pause time [sec] after channel change"},
{"path": "Tpt50/filter", "type": "int", "readonly": false, "cmd": "tt Tpt50/filter", "description": "filter average time [sec]"},
{"path": "Tpt50/dwell", "type": "int", "readonly": false, "cmd": "tt Tpt50/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tpt50/status", "type": "text"},
{"path": "Tpt50/curve", "type": "text", "readonly": false, "cmd": "tt Tpt50/curve", "kids": 1},
{"path": "Tpt50/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tpt50/curve/points", "visibility": 3},
{"path": "Tpt50/alarm", "type": "float", "readonly": false, "cmd": "tt Tpt50/alarm"},
{"path": "Tpt50/raw", "type": "float"},
{"path": "Tpt3high", "type": "float", "kids": 14},
{"path": "Tpt3high/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tpt3high/active"},
{"path": "Tpt3high/autorange", "type": "bool", "readonly": false, "cmd": "tt Tpt3high/autorange", "description": "autorange (common for all channels)"},
{"path": "Tpt3high/range", "type": "text", "readonly": false, "cmd": "tt Tpt3high/range", "description": "resistance range in Ohm"},
{"path": "Tpt3high/range_num", "type": "int"},
{"path": "Tpt3high/excitation", "type": "text", "readonly": false, "cmd": "tt Tpt3high/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tpt3high/excitation_num", "type": "int"},
{"path": "Tpt3high/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tpt3high/pause", "type": "int", "readonly": false, "cmd": "tt Tpt3high/pause", "description": "pause time [sec] after channel change"},
{"path": "Tpt3high/filter", "type": "int", "readonly": false, "cmd": "tt Tpt3high/filter", "description": "filter average time [sec]"},
{"path": "Tpt3high/dwell", "type": "int", "readonly": false, "cmd": "tt Tpt3high/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tpt3high/status", "type": "text"},
{"path": "Tpt3high/curve", "type": "text", "readonly": false, "cmd": "tt Tpt3high/curve", "kids": 1},
{"path": "Tpt3high/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tpt3high/curve/points", "visibility": 3},
{"path": "Tpt3high/alarm", "type": "float", "readonly": false, "cmd": "tt Tpt3high/alarm"},
{"path": "Tpt3high/raw", "type": "float"},
{"path": "Tpt3low", "type": "float", "kids": 14},
{"path": "Tpt3low/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tpt3low/active"},
{"path": "Tpt3low/autorange", "type": "bool", "readonly": false, "cmd": "tt Tpt3low/autorange", "description": "autorange (common for all channels)"},
{"path": "Tpt3low/range", "type": "text", "readonly": false, "cmd": "tt Tpt3low/range", "description": "resistance range in Ohm"},
{"path": "Tpt3low/range_num", "type": "int"},
{"path": "Tpt3low/excitation", "type": "text", "readonly": false, "cmd": "tt Tpt3low/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tpt3low/excitation_num", "type": "int"},
{"path": "Tpt3low/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tpt3low/pause", "type": "int", "readonly": false, "cmd": "tt Tpt3low/pause", "description": "pause time [sec] after channel change"},
{"path": "Tpt3low/filter", "type": "int", "readonly": false, "cmd": "tt Tpt3low/filter", "description": "filter average time [sec]"},
{"path": "Tpt3low/dwell", "type": "int", "readonly": false, "cmd": "tt Tpt3low/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tpt3low/status", "type": "text"},
{"path": "Tpt3low/curve", "type": "text", "readonly": false, "cmd": "tt Tpt3low/curve", "kids": 1},
{"path": "Tpt3low/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tpt3low/curve/points", "visibility": 3},
{"path": "Tpt3low/alarm", "type": "float", "readonly": false, "cmd": "tt Tpt3low/alarm"},
{"path": "Tpt3low/raw", "type": "float"},
{"path": "Twhite", "type": "float", "kids": 14},
{"path": "Twhite/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Twhite/active"},
{"path": "Twhite/autorange", "type": "bool", "readonly": false, "cmd": "tt Twhite/autorange", "description": "autorange (common for all channels)"},
{"path": "Twhite/range", "type": "text", "readonly": false, "cmd": "tt Twhite/range", "description": "resistance range in Ohm"},
{"path": "Twhite/range_num", "type": "int"},
{"path": "Twhite/excitation", "type": "text", "readonly": false, "cmd": "tt Twhite/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Twhite/excitation_num", "type": "int"},
{"path": "Twhite/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Twhite/pause", "type": "int", "readonly": false, "cmd": "tt Twhite/pause", "description": "pause time [sec] after channel change"},
{"path": "Twhite/filter", "type": "int", "readonly": false, "cmd": "tt Twhite/filter", "description": "filter average time [sec]"},
{"path": "Twhite/dwell", "type": "int", "readonly": false, "cmd": "tt Twhite/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Twhite/status", "type": "text"},
{"path": "Twhite/curve", "type": "text", "readonly": false, "cmd": "tt Twhite/curve", "kids": 1},
{"path": "Twhite/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Twhite/curve/points", "visibility": 3},
{"path": "Twhite/alarm", "type": "float", "readonly": false, "cmd": "tt Twhite/alarm"},
{"path": "Twhite/raw", "type": "float"},
{"path": "Tgreen", "type": "float", "kids": 14},
{"path": "Tgreen/active", "type": "enum", "enum": {"inactive": 0, "active": 1}, "readonly": false, "cmd": "tt Tgreen/active"},
{"path": "Tgreen/autorange", "type": "bool", "readonly": false, "cmd": "tt Tgreen/autorange", "description": "autorange (common for all channels)"},
{"path": "Tgreen/range", "type": "text", "readonly": false, "cmd": "tt Tgreen/range", "description": "resistance range in Ohm"},
{"path": "Tgreen/range_num", "type": "int"},
{"path": "Tgreen/excitation", "type": "text", "readonly": false, "cmd": "tt Tgreen/excitation", "description": "excitation with unit, i.e. 2uV or 3pA"},
{"path": "Tgreen/excitation_num", "type": "int"},
{"path": "Tgreen/excitation_mode", "type": "enum", "enum": {"voltage": 0, "current": 1, "off": 2}},
{"path": "Tgreen/pause", "type": "int", "readonly": false, "cmd": "tt Tgreen/pause", "description": "pause time [sec] after channel change"},
{"path": "Tgreen/filter", "type": "int", "readonly": false, "cmd": "tt Tgreen/filter", "description": "filter average time [sec]"},
{"path": "Tgreen/dwell", "type": "int", "readonly": false, "cmd": "tt Tgreen/dwell", "description": "dwell time [sec]. Total time per channel: pause + filter + dwell"},
{"path": "Tgreen/status", "type": "text"},
{"path": "Tgreen/curve", "type": "text", "readonly": false, "cmd": "tt Tgreen/curve", "kids": 1},
{"path": "Tgreen/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt Tgreen/curve/points", "visibility": 3},
{"path": "Tgreen/alarm", "type": "float", "readonly": false, "cmd": "tt Tgreen/alarm"},
{"path": "Tgreen/raw", "type": "float"},
{"path": "analog2", "type": "float", "readonly": false, "cmd": "tt analog2"},
{"path": "remote", "type": "bool"},
{"path": "display", "type": "text", "readonly": false, "cmd": "tt display"}]},
"cmn": {"base": "/cmn", "params": [
{"path": "", "type": "none", "kids": 6},
{"path": "send", "type": "text", "readonly": false, "cmd": "cmn send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3},
{"path": "u1", "type": "float"},
{"path": "temp", "type": "float"},
{"path": "u2", "type": "float"},
{"path": "chan", "type": "enum", "enum": {"auto": 0, "chan1": 1, "chan2": 2}, "readonly": false, "cmd": "cmn chan"}]}}

View File

@@ -284,8 +284,8 @@
{"path": "eeprom", "type": "enum", "enum": {"ok": 0, "dirty": 1, "save": 2, "load": 3}, "readonly": false, "cmd": "hemot eeprom"}, {"path": "eeprom", "type": "enum", "enum": {"ok": 0, "dirty": 1, "save": 2, "load": 3}, "readonly": false, "cmd": "hemot eeprom"},
{"path": "customadr", "type": "text", "readonly": false, "cmd": "hemot customadr"}, {"path": "customadr", "type": "text", "readonly": false, "cmd": "hemot customadr"},
{"path": "custompar", "type": "float", "readonly": false, "cmd": "hemot custompar"}]}, {"path": "custompar", "type": "float", "readonly": false, "cmd": "hemot custompar"}]},
"
ln2fill": {"base": "/ln2fill", "params": [ "ln2fill": {"base": "/ln2fill", "params": [
{"path": "", "type": "enum", "enum": {"watching": 0, "fill": 1, "inactive": 2}, "readonly": false, "cmd": "ln2fill", "kids": 14}, {"path": "", "type": "enum", "enum": {"watching": 0, "fill": 1, "inactive": 2}, "readonly": false, "cmd": "ln2fill", "kids": 14},
{"path": "send", "type": "text", "readonly": false, "cmd": "ln2fill send", "visibility": 3}, {"path": "send", "type": "text", "readonly": false, "cmd": "ln2fill send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3}, {"path": "status", "type": "text", "visibility": 3},

View File

@@ -1,50 +1,50 @@
{"tt": {"base": "/tt", "params": [ {"tt": {"base": "/tt", "params": [
{"path": "", "type": "float", "readonly": false, "cmd": "run tt", "description": "tt", "kids": 18}, {"path": "", "type": "float", "readonly": false, "cmd": "run tt", "description": "tt", "kids": 18},
{"path": "send", "type": "text", "readonly": false, "cmd": "tt send", "visibility": 3}, {"path": "send", "type": "text", "readonly": false, "cmd": "tt send", "visibility": 3},
{"path": "status", "type": "text", "readonly": false, "cmd": "run tt", "visibility": 3}, {"path": "status", "type": "text", "visibility": 3},
{"path": "is_running", "type": "int", "readonly": false, "cmd": "tt is_running", "visibility": 3}, {"path": "is_running", "type": "int", "readonly": false, "cmd": "tt is_running", "visibility": 3},
{"path": "mainloop", "type": "text", "readonly": false, "cmd": "tt mainloop", "visibility": 3}, {"path": "mainloop", "type": "text", "readonly": false, "cmd": "tt mainloop", "visibility": 3},
{"path": "target", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "target", "type": "float"},
{"path": "running", "type": "int", "readonly": false, "cmd": "run tt"}, {"path": "running", "type": "int"},
{"path": "tolerance", "type": "float", "readonly": false, "cmd": "tt tolerance"}, {"path": "tolerance", "type": "float", "readonly": false, "cmd": "tt tolerance"},
{"path": "maxwait", "type": "float", "readonly": false, "cmd": "tt maxwait"}, {"path": "maxwait", "type": "float", "readonly": false, "cmd": "tt maxwait"},
{"path": "settle", "type": "float", "readonly": false, "cmd": "tt settle"}, {"path": "settle", "type": "float", "readonly": false, "cmd": "tt settle"},
{"path": "log", "type": "text", "readonly": false, "cmd": "tt log", "visibility": 3, "kids": 4}, {"path": "log", "type": "text", "readonly": false, "cmd": "tt log", "visibility": 3, "kids": 4},
{"path": "log/mean", "type": "float", "readonly": false, "cmd": "run tt", "visibility": 3}, {"path": "log/mean", "type": "float", "visibility": 3},
{"path": "log/m2", "type": "float", "readonly": false, "cmd": "run tt", "visibility": 3}, {"path": "log/m2", "type": "float", "visibility": 3},
{"path": "log/stddev", "type": "float", "readonly": false, "cmd": "run tt", "visibility": 3}, {"path": "log/stddev", "type": "float", "visibility": 3},
{"path": "log/n", "type": "float", "readonly": false, "cmd": "run tt", "visibility": 3}, {"path": "log/n", "type": "float", "visibility": 3},
{"path": "dblctrl", "type": "bool", "readonly": false, "cmd": "tt dblctrl", "kids": 9}, {"path": "dblctrl", "type": "bool", "readonly": false, "cmd": "tt dblctrl", "kids": 9},
{"path": "dblctrl/tshift", "type": "float", "readonly": false, "cmd": "tt dblctrl/tshift"}, {"path": "dblctrl/tshift", "type": "float", "readonly": false, "cmd": "tt dblctrl/tshift"},
{"path": "dblctrl/mode", "type": "enum", "enum": {"disabled": -1, "inactive": 0, "stable": 1, "up": 2, "down": 3}, "readonly": false, "cmd": "tt dblctrl/mode"}, {"path": "dblctrl/mode", "type": "enum", "enum": {"disabled": -1, "inactive": 0, "stable": 1, "up": 2, "down": 3}, "readonly": false, "cmd": "tt dblctrl/mode"},
{"path": "dblctrl/shift_up", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "dblctrl/shift_up", "type": "float"},
{"path": "dblctrl/shift_lo", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "dblctrl/shift_lo", "type": "float"},
{"path": "dblctrl/t_min", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "dblctrl/t_min", "type": "float"},
{"path": "dblctrl/t_max", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "dblctrl/t_max", "type": "float"},
{"path": "dblctrl/int2", "type": "float", "readonly": false, "cmd": "tt dblctrl/int2"}, {"path": "dblctrl/int2", "type": "float", "readonly": false, "cmd": "tt dblctrl/int2"},
{"path": "dblctrl/prop_up", "type": "float", "readonly": false, "cmd": "tt dblctrl/prop_up"}, {"path": "dblctrl/prop_up", "type": "float", "readonly": false, "cmd": "tt dblctrl/prop_up"},
{"path": "dblctrl/prop_lo", "type": "float", "readonly": false, "cmd": "tt dblctrl/prop_lo"}, {"path": "dblctrl/prop_lo", "type": "float", "readonly": false, "cmd": "tt dblctrl/prop_lo"},
{"path": "tm", "type": "float", "readonly": false, "cmd": "run tt", "kids": 4}, {"path": "tm", "type": "float", "kids": 4},
{"path": "tm/curve", "type": "text", "readonly": false, "cmd": "tt tm/curve", "kids": 1}, {"path": "tm/curve", "type": "text", "readonly": false, "cmd": "tt tm/curve", "kids": 1},
{"path": "tm/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt tm/curve/points", "visibility": 3}, {"path": "tm/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt tm/curve/points", "visibility": 3},
{"path": "tm/alarm", "type": "float", "readonly": false, "cmd": "tt tm/alarm"}, {"path": "tm/alarm", "type": "float", "readonly": false, "cmd": "tt tm/alarm"},
{"path": "tm/stddev", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "tm/stddev", "type": "float"},
{"path": "tm/raw", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "tm/raw", "type": "float"},
{"path": "ts", "type": "float", "readonly": false, "cmd": "run tt", "kids": 4}, {"path": "ts", "type": "float", "kids": 4},
{"path": "ts/curve", "type": "text", "readonly": false, "cmd": "tt ts/curve", "kids": 1}, {"path": "ts/curve", "type": "text", "readonly": false, "cmd": "tt ts/curve", "kids": 1},
{"path": "ts/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt ts/curve/points", "visibility": 3}, {"path": "ts/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt ts/curve/points", "visibility": 3},
{"path": "ts/alarm", "type": "float", "readonly": false, "cmd": "tt ts/alarm"}, {"path": "ts/alarm", "type": "float", "readonly": false, "cmd": "tt ts/alarm"},
{"path": "ts/stddev", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "ts/stddev", "type": "float"},
{"path": "ts/raw", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "ts/raw", "type": "float"},
{"path": "ts_2", "type": "float", "readonly": false, "cmd": "run tt", "kids": 4}, {"path": "ts_2", "type": "float", "visibility": 3, "kids": 4},
{"path": "ts_2/curve", "type": "text", "readonly": false, "cmd": "tt ts_2/curve", "kids": 1}, {"path": "ts_2/curve", "type": "text", "readonly": false, "cmd": "tt ts_2/curve", "visibility": 3, "kids": 1},
{"path": "ts_2/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt ts_2/curve/points", "visibility": 3}, {"path": "ts_2/curve/points", "type": "floatvarar", "readonly": false, "cmd": "tt ts_2/curve/points", "visibility": 3},
{"path": "ts_2/alarm", "type": "float", "readonly": false, "cmd": "tt ts_2/alarm"}, {"path": "ts_2/alarm", "type": "float", "readonly": false, "cmd": "tt ts_2/alarm", "visibility": 3},
{"path": "ts_2/stddev", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "ts_2/stddev", "type": "float", "visibility": 3},
{"path": "ts_2/raw", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "ts_2/raw", "type": "float", "visibility": 3},
{"path": "set", "type": "float", "readonly": false, "cmd": "tt set", "kids": 18}, {"path": "set", "type": "float", "readonly": false, "cmd": "tt set", "kids": 18},
{"path": "set/mode", "type": "enum", "enum": {"disabled": -1, "off": 0, "controlling": 1, "manual": 2}, "readonly": false, "cmd": "tt set/mode"}, {"path": "set/mode", "type": "enum", "enum": {"disabled": -1, "off": 0, "controlling": 1, "manual": 2}, "readonly": false, "cmd": "tt set/mode"},
{"path": "set/reg", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "set/reg", "type": "float"},
{"path": "set/ramp", "type": "float", "readonly": false, "cmd": "tt set/ramp", "description": "maximum ramp in K/min (0: ramp off)"}, {"path": "set/ramp", "type": "float", "readonly": false, "cmd": "tt set/ramp", "description": "maximum ramp in K/min (0: ramp off)"},
{"path": "set/wramp", "type": "float", "readonly": false, "cmd": "tt set/wramp"}, {"path": "set/wramp", "type": "float", "readonly": false, "cmd": "tt set/wramp"},
{"path": "set/smooth", "type": "float", "readonly": false, "cmd": "tt set/smooth", "description": "smooth time (minutes)"}, {"path": "set/smooth", "type": "float", "readonly": false, "cmd": "tt set/smooth", "description": "smooth time (minutes)"},
@@ -53,17 +53,17 @@
{"path": "set/resist", "type": "float", "readonly": false, "cmd": "tt set/resist"}, {"path": "set/resist", "type": "float", "readonly": false, "cmd": "tt set/resist"},
{"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/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/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", "readonly": false, "cmd": "run tt", "description": "the maximum power limit (before any booster or converter)"}, {"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/maxpower", "type": "float", "readonly": false, "cmd": "tt set/maxpower", "description": "maximum power [W]"},
{"path": "set/maxcurrent", "type": "float", "readonly": false, "cmd": "run tt", "description": "the maximum current before any booster or converter"}, {"path": "set/maxcurrent", "type": "float", "description": "the maximum current before any booster or converter"},
{"path": "set/manualpower", "type": "float", "readonly": false, "cmd": "tt set/manualpower"}, {"path": "set/manualpower", "type": "float", "readonly": false, "cmd": "tt set/manualpower"},
{"path": "set/power", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "set/power", "type": "float"},
{"path": "set/prop", "type": "float", "readonly": false, "cmd": "tt set/prop", "description": "bigger means more gain"}, {"path": "set/prop", "type": "float", "readonly": false, "cmd": "tt set/prop", "description": "bigger means more gain"},
{"path": "set/integ", "type": "float", "readonly": false, "cmd": "tt set/integ", "description": "bigger means faster"}, {"path": "set/integ", "type": "float", "readonly": false, "cmd": "tt set/integ", "description": "bigger means faster"},
{"path": "set/deriv", "type": "float", "readonly": false, "cmd": "tt set/deriv"}, {"path": "set/deriv", "type": "float", "readonly": false, "cmd": "tt set/deriv"},
{"path": "setsamp", "type": "float", "readonly": false, "cmd": "tt setsamp", "kids": 18}, {"path": "setsamp", "type": "float", "readonly": false, "cmd": "tt setsamp", "kids": 18},
{"path": "setsamp/mode", "type": "enum", "enum": {"disabled": -1, "off": 0, "controlling": 1, "manual": 2}, "readonly": false, "cmd": "tt setsamp/mode"}, {"path": "setsamp/mode", "type": "enum", "enum": {"disabled": -1, "off": 0, "controlling": 1, "manual": 2}, "readonly": false, "cmd": "tt setsamp/mode"},
{"path": "setsamp/reg", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "setsamp/reg", "type": "float"},
{"path": "setsamp/ramp", "type": "float", "readonly": false, "cmd": "tt setsamp/ramp", "description": "maximum ramp in K/min (0: ramp off)"}, {"path": "setsamp/ramp", "type": "float", "readonly": false, "cmd": "tt setsamp/ramp", "description": "maximum ramp in K/min (0: ramp off)"},
{"path": "setsamp/wramp", "type": "float", "readonly": false, "cmd": "tt setsamp/wramp"}, {"path": "setsamp/wramp", "type": "float", "readonly": false, "cmd": "tt setsamp/wramp"},
{"path": "setsamp/smooth", "type": "float", "readonly": false, "cmd": "tt setsamp/smooth", "description": "smooth time (minutes)"}, {"path": "setsamp/smooth", "type": "float", "readonly": false, "cmd": "tt setsamp/smooth", "description": "smooth time (minutes)"},
@@ -72,16 +72,16 @@
{"path": "setsamp/resist", "type": "float", "readonly": false, "cmd": "tt setsamp/resist"}, {"path": "setsamp/resist", "type": "float", "readonly": false, "cmd": "tt setsamp/resist"},
{"path": "setsamp/maxheater", "type": "text", "readonly": false, "cmd": "tt setsamp/maxheater", "description": "maximum heater limit, units should be given without space: W, mW, A, mA"}, {"path": "setsamp/maxheater", "type": "text", "readonly": false, "cmd": "tt setsamp/maxheater", "description": "maximum heater limit, units should be given without space: W, mW, A, mA"},
{"path": "setsamp/linearpower", "type": "float", "readonly": false, "cmd": "tt setsamp/linearpower", "description": "when not 0, it is the maximum effective power, and the power is linear to the heater output"}, {"path": "setsamp/linearpower", "type": "float", "readonly": false, "cmd": "tt setsamp/linearpower", "description": "when not 0, it is the maximum effective power, and the power is linear to the heater output"},
{"path": "setsamp/maxpowerlim", "type": "float", "readonly": false, "cmd": "run tt", "description": "the maximum power limit (before any booster or converter)"}, {"path": "setsamp/maxpowerlim", "type": "float", "description": "the maximum power limit (before any booster or converter)"},
{"path": "setsamp/maxpower", "type": "float", "readonly": false, "cmd": "tt setsamp/maxpower", "description": "maximum power [W]"}, {"path": "setsamp/maxpower", "type": "float", "readonly": false, "cmd": "tt setsamp/maxpower", "description": "maximum power [W]"},
{"path": "setsamp/maxcurrent", "type": "float", "readonly": false, "cmd": "run tt", "description": "the maximum current before any booster or converter"}, {"path": "setsamp/maxcurrent", "type": "float", "description": "the maximum current before any booster or converter"},
{"path": "setsamp/manualpower", "type": "float", "readonly": false, "cmd": "tt setsamp/manualpower"}, {"path": "setsamp/manualpower", "type": "float", "readonly": false, "cmd": "tt setsamp/manualpower"},
{"path": "setsamp/power", "type": "float", "readonly": false, "cmd": "run tt"}, {"path": "setsamp/power", "type": "float"},
{"path": "setsamp/prop", "type": "float", "readonly": false, "cmd": "tt setsamp/prop", "description": "bigger means more gain"}, {"path": "setsamp/prop", "type": "float", "readonly": false, "cmd": "tt setsamp/prop", "description": "bigger means more gain"},
{"path": "setsamp/integ", "type": "float", "readonly": false, "cmd": "tt setsamp/integ", "description": "bigger means faster"}, {"path": "setsamp/integ", "type": "float", "readonly": false, "cmd": "tt setsamp/integ", "description": "bigger means faster"},
{"path": "setsamp/deriv", "type": "float", "readonly": false, "cmd": "tt setsamp/deriv"}, {"path": "setsamp/deriv", "type": "float", "readonly": false, "cmd": "tt setsamp/deriv"},
{"path": "display", "type": "text", "readonly": false, "cmd": "tt display"}, {"path": "display", "type": "text", "readonly": false, "cmd": "tt display"},
{"path": "remote", "type": "bool", "readonly": false, "cmd": "run tt"}]}, {"path": "remote", "type": "bool"}]},
"cc": {"base": "/cc", "params": [ "cc": {"base": "/cc", "params": [
{"path": "", "type": "bool", "kids": 96}, {"path": "", "type": "bool", "kids": 96},
@@ -108,7 +108,7 @@
{"path": "mcr", "type": "float"}, {"path": "mcr", "type": "float"},
{"path": "mot", "type": "float"}, {"path": "mot", "type": "float"},
{"path": "mw", "type": "float", "readonly": false, "cmd": "cc mw", "description": "correction pulse after automatic open"}, {"path": "mw", "type": "float", "readonly": false, "cmd": "cc mw", "description": "correction pulse after automatic open"},
{"path": "hav", "type": "enum", "type": "enum", "enum": {"none": 0, "int": 1, "ext": 2}, "readonly": false, "cmd": "cc hav"}, {"path": "hav", "type": "enum", "enum": {"none": 0, "int": 1, "ext": 2}, "readonly": false, "cmd": "cc hav"},
{"path": "h", "type": "float"}, {"path": "h", "type": "float"},
{"path": "hr", "type": "float"}, {"path": "hr", "type": "float"},
{"path": "hc", "type": "float"}, {"path": "hc", "type": "float"},
@@ -132,26 +132,26 @@
{"path": "hms", "type": "float"}, {"path": "hms", "type": "float"},
{"path": "hit", "type": "float", "readonly": false, "cmd": "cc hit"}, {"path": "hit", "type": "float", "readonly": false, "cmd": "cc hit"},
{"path": "hft", "type": "int", "readonly": false, "cmd": "cc hft"}, {"path": "hft", "type": "int", "readonly": false, "cmd": "cc hft"},
{"path": "hea", "type": "enum", "enum": {"0": 0, "1": 1, "6": 2}, "readonly": false, "cmd": "cc hea"}, {"path": "hea", "type": "enum", "enum": {"0": 0, "1": 1, "6": 6}, "readonly": false, "cmd": "cc hea"},
{"path": "hch", "type": "int", "readonly": false, "cmd": "cc hch", "visibility": 3}, {"path": "hch", "type": "int", "readonly": false, "cmd": "cc hch"},
{"path": "hwr0", "type": "float", "readonly": false, "cmd": "cc hwr0", "visibility": 3}, {"path": "hwr0", "type": "float", "readonly": false, "cmd": "cc hwr0"},
{"path": "hem0", "type": "float", "readonly": false, "cmd": "cc hem0", "description": "sensor length in mm from top to empty pos.", "visibility": 3}, {"path": "hem0", "type": "float", "readonly": false, "cmd": "cc hem0", "description": "sensor length in mm from top to empty pos."},
{"path": "hfu0", "type": "float", "readonly": false, "cmd": "cc hfu0", "description": "sensor length in mm from top to full pos.", "visibility": 3}, {"path": "hfu0", "type": "float", "readonly": false, "cmd": "cc hfu0", "description": "sensor length in mm from top to full pos."},
{"path": "hd0", "type": "float", "readonly": false, "cmd": "cc hd0", "description": "external sensor drive current (mA)", "visibility": 3}, {"path": "hd0", "type": "float", "readonly": false, "cmd": "cc hd0", "description": "external sensor drive current (mA)"},
{"path": "h0", "type": "float", "visibility": 3}, {"path": "h0", "type": "float"},
{"path": "hs0", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3}, {"path": "hs0", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}},
{"path": "h1", "type": "float", "visibility": 3}, {"path": "h1", "type": "float"},
{"path": "hs1", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3}, {"path": "hs1", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}},
{"path": "h2", "type": "float", "visibility": 3}, {"path": "h2", "type": "float"},
{"path": "hs2", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3}, {"path": "hs2", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}},
{"path": "h3", "type": "float", "visibility": 3}, {"path": "h3", "type": "float"},
{"path": "hs3", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3}, {"path": "hs3", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}},
{"path": "h4", "type": "float", "visibility": 3}, {"path": "h4", "type": "float"},
{"path": "hs4", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3}, {"path": "hs4", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}},
{"path": "h5", "type": "float", "visibility": 3}, {"path": "h5", "type": "float"},
{"path": "hs5", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}, "visibility": 3}, {"path": "hs5", "type": "enum", "enum": {"sens_ok": 0, "sens_warm": 1, "no_sens": 2, "timeout": 3, "not_yet_read": 4, "disabled": 5}},
{"path": "hfb", "type": "float"}, {"path": "hfb", "type": "float"},
{"path": "nav", "type": "enum", "type": "enum", "enum": {"none": 0, "int": 1, "ext": 2}, "readonly": false, "cmd": "cc nav"}, {"path": "nav", "type": "bool", "readonly": false, "cmd": "cc nav"},
{"path": "nu", "type": "float"}, {"path": "nu", "type": "float"},
{"path": "nl", "type": "float"}, {"path": "nl", "type": "float"},
{"path": "nth", "type": "float", "readonly": false, "cmd": "cc nth"}, {"path": "nth", "type": "float", "readonly": false, "cmd": "cc nth"},
@@ -183,15 +183,16 @@
{"path": "bdl", "type": "float", "readonly": false, "cmd": "cc bdl"}]}, {"path": "bdl", "type": "float", "readonly": false, "cmd": "cc bdl"}]},
"nv": {"base": "/nv", "params": [ "nv": {"base": "/nv", "params": [
{"path": "", "type": "enum", "enum": {"fixed": 0, "controlled": 1, "automatic": 2, "close": 3, "open": 4}, "readonly": false, "cmd": "nv", "kids": 11}, {"path": "", "type": "enum", "enum": {"fixed": 0, "controlled": 1, "automatic": 2, "close": 3, "open": 4}, "readonly": false, "cmd": "nv", "kids": 12},
{"path": "send", "type": "text", "readonly": false, "cmd": "nv send", "visibility": 3}, {"path": "send", "type": "text", "readonly": false, "cmd": "nv send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3}, {"path": "status", "type": "text", "visibility": 3},
{"path": "motstat", "type": "enum", "enum": {"idle": 0, "opening": 1, "closing": 2, "opened": 3, "closed": 4, "no_motor": 5}}, {"path": "motstat", "type": "enum", "enum": {"idle": 0, "opening": 1, "closing": 2, "opened": 3, "closed": 4, "no_motor": 5}},
{"path": "flow", "type": "float"}, {"path": "flow", "type": "float"},
{"path": "set", "type": "float", "readonly": false, "cmd": "nv set"}, {"path": "set", "type": "float", "readonly": false, "cmd": "nv set"},
{"path": "flowmax", "type": "float", "readonly": false, "cmd": "nv flowmax"}, {"path": "flowmax", "type": "float", "readonly": false, "cmd": "nv flowmax"},
{"path": "flowp", "type": "float"}, {"path": "flowp", "type": "float", "description": "flow calculated from pressure before pump"},
{"path": "span", "type": "float"}, {"path": "span", "type": "float"},
{"path": "use_pressure", "type": "bool", "readonly": false, "cmd": "nv use_pressure", "description": "use pressure instead of flow meter for control"},
{"path": "ctrl", "type": "none", "kids": 13}, {"path": "ctrl", "type": "none", "kids": 13},
{"path": "ctrl/regtext", "type": "text"}, {"path": "ctrl/regtext", "type": "text"},
{"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_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"},
@@ -235,15 +236,34 @@
{"path": "calib/ln_per_min_per_mbar", "type": "float", "readonly": false, "cmd": "nv calib/ln_per_min_per_mbar"}, {"path": "calib/ln_per_min_per_mbar", "type": "float", "readonly": false, "cmd": "nv calib/ln_per_min_per_mbar"},
{"path": "calib/mbar_offset", "type": "float", "readonly": false, "cmd": "nv calib/mbar_offset"}]}, {"path": "calib/mbar_offset", "type": "float", "readonly": false, "cmd": "nv calib/mbar_offset"}]},
"hefill": {"base": "/hefill", "params": [
{"path": "", "type": "enum", "enum": {"watching": 0, "filling": 1, "inactive": 2, "manualfill": 3}, "readonly": false, "cmd": "hefill", "kids": 16},
{"path": "send", "type": "text", "readonly": false, "cmd": "hefill send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3},
{"path": "state", "type": "text"},
{"path": "readpath", "type": "text", "readonly": false, "cmd": "hefill readpath", "visibility": 3},
{"path": "lowlevel", "type": "float", "readonly": false, "cmd": "hefill lowlevel"},
{"path": "highlevel", "type": "float", "readonly": false, "cmd": "hefill highlevel"},
{"path": "smooth", "type": "float"},
{"path": "minfillminutes", "type": "float", "readonly": false, "cmd": "hefill minfillminutes"},
{"path": "maxfillminutes", "type": "float", "readonly": false, "cmd": "hefill maxfillminutes"},
{"path": "minholdhours", "type": "float", "readonly": false, "cmd": "hefill minholdhours"},
{"path": "maxholdhours", "type": "float", "readonly": false, "cmd": "hefill maxholdhours"},
{"path": "tolerance", "type": "float", "readonly": false, "cmd": "hefill tolerance"},
{"path": "badreadingminutes", "type": "float", "readonly": false, "cmd": "hefill badreadingminutes"},
{"path": "tubecoolingminutes", "type": "float", "readonly": false, "cmd": "hefill tubecoolingminutes"},
{"path": "vessellimit", "type": "float", "readonly": false, "cmd": "hefill vessellimit"},
{"path": "vext", "type": "float"}]},
"hepump": {"base": "/hepump", "params": [ "hepump": {"base": "/hepump", "params": [
{"path": "", "type": "enum", "enum": {"neodry": 8, "xds35_auto": 0, "xds35_manual": 1, "sv65": 2, "other": 3, "no": -1}, "readonly": false, "cmd": "hepump", "description": "xds35: scroll pump, sv65: leybold", "kids": 10}, {"path": "", "type": "enum", "enum": {"neodry": 8, "xds35_auto": 0, "xds35_manual": 1, "sv65": 2, "other": 3, "no": -1}, "readonly": false, "cmd": "hepump", "description": "xds35: scroll pump, sv65: leybold", "kids": 10},
{"path": "send", "type": "text", "readonly": false, "cmd": "hepump send", "visibility": 3}, {"path": "send", "type": "text", "readonly": false, "cmd": "hepump send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3}, {"path": "status", "type": "text", "visibility": 3},
{"path": "running", "type": "bool", "readonly": false, "cmd": "hepump running"}, {"path": "running", "type": "bool", "readonly": false, "cmd": "hepump running"},
{"path": "eco", "type": "bool", "readonly": false, "cmd": "hepump eco"}, {"path": "eco", "type": "bool", "readonly": false, "cmd": "hepump eco", "visibility": 3},
{"path": "auto", "type": "bool", "readonly": false, "cmd": "hepump auto"}, {"path": "auto", "type": "bool", "readonly": false, "cmd": "hepump auto", "visibility": 3},
{"path": "valve", "type": "enum", "enum": {"closed": 0, "closing": 1, "opening": 2, "opened": 3, "undefined": 4}, "readonly": false, "cmd": "hepump valve"}, {"path": "valve", "type": "enum", "enum": {"closed": 0, "closing": 1, "opening": 2, "opened": 3, "undefined": 4}, "readonly": false, "cmd": "hepump valve"},
{"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": "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", "visibility": 3},
{"path": "calib", "type": "float", "readonly": false, "cmd": "hepump calib", "visibility": 3}, {"path": "calib", "type": "float", "readonly": false, "cmd": "hepump calib", "visibility": 3},
{"path": "health", "type": "float"}]}, {"path": "health", "type": "float"}]},
@@ -291,11 +311,11 @@
{"path": "save", "type": "bool", "readonly": false, "cmd": "nvflow save", "description": "unchecked: current calib is not saved. set checked: save calib"}]}, {"path": "save", "type": "bool", "readonly": false, "cmd": "nvflow save", "description": "unchecked: current calib is not saved. set checked: save calib"}]},
"ln2fill": {"base": "/ln2fill", "params": [ "ln2fill": {"base": "/ln2fill", "params": [
{"path": "", "type": "enum", "enum": {"watching": 0, "fill": 1, "inactive": 2}, "readonly": false, "cmd": "ln2fill", "kids": 14}, {"path": "", "type": "enum", "enum": {"watching": 0, "filling": 1, "inactive": 2, "manualfill": 3}, "readonly": false, "cmd": "ln2fill", "kids": 14},
{"path": "send", "type": "text", "readonly": false, "cmd": "ln2fill send", "visibility": 3}, {"path": "send", "type": "text", "readonly": false, "cmd": "ln2fill send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3}, {"path": "status", "type": "text", "visibility": 3},
{"path": "state", "type": "text"}, {"path": "state", "type": "text"},
{"path": "readlevel", "type": "text", "readonly": false, "cmd": "ln2fill readlevel", "visibility": 3}, {"path": "readpath", "type": "text", "readonly": false, "cmd": "ln2fill readpath", "visibility": 3},
{"path": "lowlevel", "type": "float", "readonly": false, "cmd": "ln2fill lowlevel"}, {"path": "lowlevel", "type": "float", "readonly": false, "cmd": "ln2fill lowlevel"},
{"path": "highlevel", "type": "float", "readonly": false, "cmd": "ln2fill highlevel"}, {"path": "highlevel", "type": "float", "readonly": false, "cmd": "ln2fill highlevel"},
{"path": "smooth", "type": "float"}, {"path": "smooth", "type": "float"},
@@ -307,52 +327,33 @@
{"path": "badreadingminutes", "type": "float", "readonly": false, "cmd": "ln2fill badreadingminutes"}, {"path": "badreadingminutes", "type": "float", "readonly": false, "cmd": "ln2fill badreadingminutes"},
{"path": "tubecoolingminutes", "type": "float", "readonly": false, "cmd": "ln2fill tubecoolingminutes"}]}, {"path": "tubecoolingminutes", "type": "float", "readonly": false, "cmd": "ln2fill tubecoolingminutes"}]},
"hefill": {"base": "/hefill", "params": [
{"path": "", "type": "enum", "enum": {"watching": 0, "fill": 1, "inactive": 2}, "readonly": false, "cmd": "hefill", "kids": 16},
{"path": "send", "type": "text", "readonly": false, "cmd": "hefill send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3},
{"path": "state", "type": "text"},
{"path": "readlevel", "type": "text", "readonly": false, "cmd": "hefill readlevel", "visibility": 3},
{"path": "lowlevel", "type": "float", "readonly": false, "cmd": "hefill lowlevel"},
{"path": "highlevel", "type": "float", "readonly": false, "cmd": "hefill highlevel"},
{"path": "smooth", "type": "float"},
{"path": "minfillminutes", "type": "float", "readonly": false, "cmd": "hefill minfillminutes"},
{"path": "maxfillminutes", "type": "float", "readonly": false, "cmd": "hefill maxfillminutes"},
{"path": "minholdhours", "type": "float", "readonly": false, "cmd": "hefill minholdhours"},
{"path": "maxholdhours", "type": "float", "readonly": false, "cmd": "hefill maxholdhours"},
{"path": "tolerance", "type": "float", "readonly": false, "cmd": "hefill tolerance"},
{"path": "badreadingminutes", "type": "float", "readonly": false, "cmd": "hefill badreadingminutes"},
{"path": "tubecoolingminutes", "type": "float", "readonly": false, "cmd": "hefill tubecoolingminutes"},
{"path": "vessellimit", "type": "float", "readonly": false, "cmd": "hefill vessellimit"},
{"path": "vext", "type": "float"}]},
"mf": {"base": "/mf", "params": [ "mf": {"base": "/mf", "params": [
{"path": "", "type": "float", "readonly": false, "cmd": "run mf", "kids": 26}, {"path": "", "type": "float", "readonly": false, "cmd": "run mf", "kids": 26},
{"path": "persmode", "type": "int", "readonly": false, "cmd": "mf persmode"}, {"path": "persmode", "type": "int", "readonly": false, "cmd": "mf persmode"},
{"path": "perswitch", "type": "int", "readonly": false, "cmd": "run mf"}, {"path": "perswitch", "type": "int"},
{"path": "nowait", "type": "int", "readonly": false, "cmd": "mf nowait"}, {"path": "nowait", "type": "int", "readonly": false, "cmd": "mf nowait"},
{"path": "maxlimit", "type": "float", "readonly": false, "cmd": "run mf", "visibility": 3}, {"path": "maxlimit", "type": "float", "visibility": 3},
{"path": "limit", "type": "float", "readonly": false, "cmd": "mf limit"}, {"path": "limit", "type": "float", "readonly": false, "cmd": "mf limit"},
{"path": "ramp", "type": "float", "readonly": false, "cmd": "mf ramp"}, {"path": "ramp", "type": "float", "readonly": false, "cmd": "mf ramp"},
{"path": "perscurrent", "type": "float", "readonly": false, "cmd": "mf perscurrent"}, {"path": "perscurrent", "type": "float", "readonly": false, "cmd": "mf perscurrent"},
{"path": "perslimit", "type": "float", "readonly": false, "cmd": "mf perslimit"}, {"path": "perslimit", "type": "float", "readonly": false, "cmd": "mf perslimit"},
{"path": "perswait", "type": "int", "readonly": false, "cmd": "mf perswait"}, {"path": "perswait", "type": "int", "readonly": false, "cmd": "mf perswait"},
{"path": "persdelay", "type": "int", "readonly": false, "cmd": "mf persdelay"}, {"path": "persdelay", "type": "int", "readonly": false, "cmd": "mf persdelay"},
{"path": "current", "type": "float", "readonly": false, "cmd": "run mf"}, {"path": "current", "type": "float"},
{"path": "measured", "type": "float", "readonly": false, "cmd": "run mf"}, {"path": "measured", "type": "float"},
{"path": "voltage", "type": "float", "readonly": false, "cmd": "run mf"}, {"path": "voltage", "type": "float"},
{"path": "lastfield", "type": "float", "readonly": false, "cmd": "run mf", "visibility": 3}, {"path": "lastfield", "type": "float", "visibility": 3},
{"path": "ampRamp", "type": "float", "readonly": false, "cmd": "run mf", "visibility": 3}, {"path": "ampRamp", "type": "float", "visibility": 3},
{"path": "inductance", "type": "float", "readonly": false, "cmd": "run mf", "visibility": 3}, {"path": "inductance", "type": "float", "visibility": 3},
{"path": "trainedTo", "type": "float", "readonly": false, "cmd": "mf trainedTo"}, {"path": "trainedTo", "type": "float", "readonly": false, "cmd": "mf trainedTo"},
{"path": "trainMode", "type": "int", "readonly": false, "cmd": "run mf"}, {"path": "trainMode", "type": "int"},
{"path": "external", "type": "int", "readonly": false, "cmd": "mf external"}, {"path": "external", "type": "int", "readonly": false, "cmd": "mf external"},
{"path": "startScript", "type": "text", "readonly": false, "cmd": "mf startScript", "visibility": 3}, {"path": "startScript", "type": "text", "readonly": false, "cmd": "mf startScript", "visibility": 3},
{"path": "is_running", "type": "int", "readonly": false, "cmd": "run mf", "visibility": 3}, {"path": "is_running", "type": "int", "readonly": false, "cmd": "mf is_running", "visibility": 3},
{"path": "verbose", "type": "int", "readonly": false, "cmd": "mf verbose", "visibility": 3}, {"path": "verbose", "type": "int", "readonly": false, "cmd": "mf verbose", "visibility": 3},
{"path": "driver", "type": "text", "readonly": false, "cmd": "run mf", "visibility": 3}, {"path": "driver", "type": "text", "visibility": 3},
{"path": "creationCmd", "type": "text", "readonly": false, "cmd": "run mf", "visibility": 3}, {"path": "creationCmd", "type": "text", "visibility": 3},
{"path": "targetValue", "type": "float", "readonly": false, "cmd": "run mf"}, {"path": "targetValue", "type": "float"},
{"path": "status", "type": "text", "readonly": false, "cmd": "mf status", "visibility": 3}]}, {"path": "status", "type": "text", "readonly": false, "cmd": "mf status", "visibility": 3}]},
"lev": {"base": "/lev", "params": [ "lev": {"base": "/lev", "params": [
@@ -362,7 +363,22 @@
{"path": "mode", "type": "enum", "enum": {"slow": 0, "fast (switches to slow automatically after filling)": 1}, "readonly": false, "cmd": "lev mode"}, {"path": "mode", "type": "enum", "enum": {"slow": 0, "fast (switches to slow automatically after filling)": 1}, "readonly": false, "cmd": "lev mode"},
{"path": "n2", "type": "float"}]}, {"path": "n2", "type": "float"}]},
"prep0": {"base": "/prep0", "params": [ "table": {"base": "/table", "params": [
{"path": "", "type": "text", "readonly": false, "cmd": "prep0", "kids": 2}, {"path": "", "type": "none", "kids": 17},
{"path": "send", "type": "text", "readonly": false, "cmd": "prep0 send", "visibility": 3}, {"path": "send", "type": "text", "readonly": false, "cmd": "table send", "visibility": 3},
{"path": "status", "type": "text", "visibility": 3}]}} {"path": "status", "type": "text", "visibility": 3},
{"path": "fix_tt_set_prop", "type": "bool", "readonly": false, "cmd": "table fix_tt_set_prop"},
{"path": "val_tt_set_prop", "type": "float"},
{"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": "fix_tt_set_integ", "type": "bool", "readonly": false, "cmd": "table fix_tt_set_integ"},
{"path": "val_tt_set_integ", "type": "float"},
{"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": "fix_tt_dblctrl_int2", "type": "bool", "readonly": false, "cmd": "table fix_tt_dblctrl_int2"},
{"path": "val_tt_dblctrl_int2", "type": "float"},
{"path": "tbl_tt_dblctrl_int2", "type": "text", "readonly": false, "cmd": "table tbl_tt_dblctrl_int2", "description": "enter value pair separated with colon T1:par1 T2:par2 ..."},
{"path": "fix_tt_dblctrl_prop_up", "type": "bool", "readonly": false, "cmd": "table fix_tt_dblctrl_prop_up"},
{"path": "val_tt_dblctrl_prop_up", "type": "float"},
{"path": "tbl_tt_dblctrl_prop_up", "type": "text", "readonly": false, "cmd": "table tbl_tt_dblctrl_prop_up", "description": "enter value pair separated with colon T1:par1 T2:par2 ..."},
{"path": "fix_tt_dblctrl_prop_lo", "type": "bool", "readonly": false, "cmd": "table fix_tt_dblctrl_prop_lo"},
{"path": "val_tt_dblctrl_prop_lo", "type": "float"},
{"path": "tbl_tt_dblctrl_prop_lo", "type": "text", "readonly": false, "cmd": "table tbl_tt_dblctrl_prop_lo", "description": "enter value pair separated with colon T1:par1 T2:par2 ..."}]}}

View File

@@ -1,20 +1,20 @@
# pylint: skip-file # pylint: skip-file
Node('ccr12', Node('ccr12',
'[sim] CCR12 box of MLZ Sample environment group' '[sim] CCR12 box of MLZ Sample environment group\n'
'' '\n'
'Contains a Lakeshore 336 and an PLC controlling the compressor' 'Contains a Lakeshore 336 and an PLC controlling the compressor\n'
'and some valves.' 'and some valves.\n'
'' '\n'
'This is an improved version, how we think it should be.', 'This is an improved version, how we think it should be.\n',
'tcp://10767', 'tcp://10767',
) )
Mod('T_ccr12', Mod('T_ccr12',
'frappy.simulation.SimDrivable', 'frappy.simulation.SimDrivable',
'Main temperature control node of CCR12.' 'Main temperature control node of CCR12.\n'
'' '\n'
'Switches between regulation on stick and regulation on tube depending on temperature requested.' 'Switches between regulation on stick and regulation on tube depending on temperature requested.\n'
'May also pump gas for higher temperatures, if configured.' 'May also pump gas for higher temperatures, if configured.\n'
'Manual switching of the regulation node is supported via the regulationmode parameter.', 'Manual switching of the regulation node is supported via the regulationmode parameter.',
value = Param(default=300, value = Param(default=300,
datatype={"type":"double", "min":0, "max":600, "unit":"K"}), datatype={"type":"double", "min":0, "max":600, "unit":"K"}),

View File

@@ -54,7 +54,7 @@ Mod('T',
'frappy_psi.softcal.Sensor', 'frappy_psi.softcal.Sensor',
'temperature sensor, soft calibration', 'temperature sensor, soft calibration',
rawsensor='res', rawsensor='res',
calib='X132254', calcurve='X132254',
value=Param( value=Param(
unit='K', unit='K',
), ),

View File

@@ -16,5 +16,5 @@ Mod('T2',
'', '',
value = Param(unit = 'K'), value = Param(unit = 'K'),
rawsensor = 'r2', rawsensor = 'r2',
calib = 'X131346', calcurve = 'X131346',
) )

View File

@@ -43,5 +43,5 @@ Mod('ts',
'calibrated value for ts', 'calibrated value for ts',
value = Param(unit = 'K'), value = Param(unit = 'K'),
rawsensor = 'tsraw', rawsensor = 'tsraw',
calib = 'X133834', calcurve = 'X133834',
) )

View File

@@ -38,6 +38,6 @@ Mod('T_sample',
output_module='htr_sample', output_module='htr_sample',
p=1, p=1,
i=0.01, i=0.01,
calib='X161269', calcurve='X161269',
value=Param(unit='K'), value=Param(unit='K'),
) )

View File

@@ -9,10 +9,23 @@ Mod('sea_stick',
service='stick', service='stick',
) )
Mod('ts', Mod('ts_sea',
'frappy_psi.sea.SeaReadable', '', 'frappy_psi.sea.SeaReadable',
meaning=['temperature', 30], 'readable sample stick T',
io='sea_stick', io='sea_stick',
sea_path='tt/ts',
json_file='ma7.config.json', json_file='ma7.config.json',
sea_object='tt',
rel_paths=['ts', 'setsamp'],
) )
Mod('ts',
'frappy_psi.parmod.Converging',
'drivable stick T using setsamp',
unit='K',
read='ts_sea.value',
write='ts_sea.setsamp',
meaning=['temperature', 20],
settling_time=20,
tolerance=1,
)

View File

@@ -1,3 +1,33 @@
import os
Node('mb11.stick.sea.psi.ch', Node('mb11.stick.sea.psi.ch',
'MB11 standard sample stick (do not use)', 'MB11 standard sample stick (do not use)',
) )
frappy_main_port = os.environ.get('FRAPPY_MAIN_PORT', 0)
Mod('itc1_',
'frappy.core.Proxy',
'itc1 on main frappy server',
remote_class = 'frappy_psi.mercury.IO',
uri = f'tcp://localhost:{frappy_main_port}',
module='itc1',
# export = False,
)
Mod('T_sample',
'frappy_psi.mercury.TemperatureLoop',
'T at sample stick sensor',
meaning=['temperature', 30],
io='itc1_',
slot='MB1.T1',
)
Mod('htr_sample',
'frappy_psi.mercury.HeaterOutput',
'sample stick heater power',
slot='MB0.H1',
io='itc1_',
)

View File

@@ -0,0 +1,34 @@
Node('mspare.stick.sea.psi.ch',
'MA generic sample stick',
)
Mod('sea_stick',
'frappy_psi.sea.SeaClient',
'SEA stick connection',
config='mspare.stick',
service='stick',
)
Mod('ts',
'frappy_psi.sea.SeaReadable',
'sample stick temperature',
io='sea_stick',
json_file='ma6.config.json',
sea_object='tt',
rel_paths=['ts', 'setsamp'],
meaning=['temperature', 30],
)
"""
Mod('ts',
'frappy_psi.parmod.Converging',
'drivable stick T using setsamp',
meaning=['temperature', 25],
unit='K',
read='tsam.value',
write='tsam.setsamp',
settling_time=20,
tolerance=1,
)
"""

24
cfg/tcs_cfg.py Normal file
View File

@@ -0,0 +1,24 @@
Node('tcstest.psi.ch',
'heater tcs test',
'tcp://5000',
)
Mod('io',
'frappy_psi.tcs.IO',
'tcs communication',
uri='linse-leiden-ts:3005',
)
Mod('still_htr',
'frappy_psi.tcs.Heater',
'still heater',
io='io',
channel=2,
)
Mod('mix_htr',
'frappy_psi.tcs.Heater',
'mixing chamber heater',
io='io',
channel=3,
)

15
cfg/test_function_cfg.py Normal file
View File

@@ -0,0 +1,15 @@
Node('softcal.function.test',
'test the function class',
'tcp://5000',
)
Mod('sim_writable',
'frappy_demo.test.SimpleWritable',
'simulation of a writable for function test',
)
Mod('function',
'frappy_psi.softcal.Function',
'function test',
rawsensor = 'sim_writable',
)

81
cfg/thermofischer_cfg.py Normal file
View File

@@ -0,0 +1,81 @@
Node('thermofischer.psi.ch',
'thermofischer_waterbath',
'tcp://5000',
)
Mod('wio_1',
'frappy_psi.thermofisher.ThermFishIO',
'connection for water bath',
uri='serial:///dev/ttyUSB0?baudrate=19200', # 3001 = Port 1, 3002 = Port 2 ...
)
Mod('wio_2',
'frappy_psi.thermofisher.ThermFishIO',
'connection for water bath',
uri='serial:///dev/ttyUSB1?baudrate=19200', # 3001 = Port 1, 3002 = Port 2 ...
)
Mod('wio_3',
'frappy_psi.thermofisher.ThermFishIO',
'connection for water bath',
uri='serial:///dev/ttyUSB2?baudrate=19200', # 3001 = Port 1, 3002 = Port 2 ...
)
Mod('Tbath_1',
'frappy_psi.thermofisher.TemperatureLoopA10',
'water_bath_1',
io='wio_1',
control_active=0,
target=25,
tolerance=0.1,
settling_time=20,
)
Mod('Tbath_2',
'frappy_psi.thermofisher.TemperatureLoopA10',
'water_bath_2',
io='wio_2',
control_active=0,
target=25,
tolerance=0.1,
settling_time=20,
)
Mod('Tbath_3',
'frappy_psi.thermofisher.TemperatureLoopA10',
'water_bath_3',
io='wio_3',
control_active=0,
target=25,
tolerance=0.1,
settling_time=20,
)
Mod('valve_1',
'frappy_psi.ionopimax.DigitalOutput',
'valve_for_fast_water_temperature_changing',
addr = 'o1',
target = 0,
)
Mod('valve_2',
'frappy_psi.ionopimax.DigitalOutput',
'valve_for_fast_water_temperature_changing',
addr = 'o2',
target = 0,
)
Mod('valve_3',
'frappy_psi.ionopimax.DigitalOutput',
'valve_for_fast_water_temperature_changing',
addr = 'o3',
target = 0,
)
Mod('temp_sensor_1',
'frappy_psi.ionopimax.SimpleVoltageInput',
'temperatur_sensor_sample',
rawrange = (0.0, 10.0),
valuerange = (-40.0, 150.0),
addr = 'ai1_mv',
)

View File

@@ -52,7 +52,7 @@ Mod('T',
'frappy_psi.softcal.Sensor', 'frappy_psi.softcal.Sensor',
'sample T', 'sample T',
rawsensor='res', rawsensor='res',
calib='X132254', calcurve='X132254',
value=Param( value=Param(
unit='K', unit='K',
), ),

View File

@@ -88,16 +88,13 @@ Mod('interlocks',
vacuum_limit = 0.1, vacuum_limit = 0.1,
) )
Mod('p_io',
'frappy_psi.pfeiffer.IO',
'pressure io',
uri='serial:///dev/ttyUSBlower',
)
Mod('p', Mod('p',
'frappy_psi.pfeiffer.Pressure', 'frappy_psi.ionopimax.LogVoltageInput',
'pressure reading', 'pressure reading',
io = 'p_io', addr = 'av1',
rawrange = (1.8, 8.6),
valuerange = (1e-7, 1000),
value = Param(unit='mbar'),
) )

161
debian/changelog vendored
View File

@@ -1,4 +1,65 @@
frappy-core (0.20.4) jammy; urgency=medium frappy-core (0.20.7) stable; urgency=medium
* fix debian install
-- Georg Brandl <jenkins@frm2.tum.de> Fri, 25 Jul 2025 13:22:54 +0200
frappy-core (0.20.6) stable; urgency=medium
[ Markus Zolliker ]
* config: add 'include' and 'override'
* frappy.client.interactive: no pathlib needed here
[ Georg Brandl ]
* install systemd units to /usr/lib
-- Markus Zolliker <jenkins@frm2.tum.de> Thu, 24 Jul 2025 22:26:02 +0200
frappy-core (0.20.5) stable; urgency=medium
[ Markus Zolliker ]
* add sim-server again based on socketserver
* fix bug when overriding a property with bare value
* frappy.server bug fix: server name must not be a list
* frappy.server: use server name for SecNode name
* frappy.server: remove comment about opts in SecNode/Dispatcher
* follow up change for 'better order of accessibles' (34904)
* better message when a parameter is overridden by an invalid value
* pylint: increase max number of positional arguments
* an error on a write must not send an error update
* fix bug in change 35001 (better error message)
* make UPD listener work when 'tcp://' is omitted on interface
* config: do not override equipment_id with name
* equipment_id for merged configs and routed nodes
* core: alternative approach for optional accessibles
* core: simplify test for methods names
[ Georg Brandl ]
* debian: update compat
* remove wrong <weight> from fonts on Qt6
[ Markus Zolliker ]
* config: validate value and default of parameters
* config: Mod() should return config dict
* stop poller threads on shutdown
* fix overriding Parameter with value
* improve error messages on module creation
* make sure unexported modules are initialized
* change to new visibility spec
* follow-up change to 35931: make Proxy a Module
[ Konstantin Kholostov ]
* installer: add recipe to build macOS app bundle
[ Markus Zolliker ]
* frappy.client.SecopClient: fix setParameterFromString
* frappy_psi/ls370res: various bug fixes
* client: add SecopClient.execCommandFromString
* frappy.client.interactive: improve updates while driving
-- Markus Zolliker <jenkins@frm2.tum.de> Mon, 12 May 2025 14:03:22 +0200
frappy-core (0.20.4) stable; urgency=medium
[ Georg Brandl ] [ Georg Brandl ]
* remove unused file * remove unused file
@@ -17,7 +78,7 @@ frappy-core (0.20.4) jammy; urgency=medium
-- Georg Brandl <jenkins@frm2.tum.de> Thu, 14 Nov 2024 14:43:54 +0100 -- Georg Brandl <jenkins@frm2.tum.de> Thu, 14 Nov 2024 14:43:54 +0100
frappy-core (0.20.3) jammy; urgency=medium frappy-core (0.20.3) stable; urgency=medium
[ Georg Brandl ] [ Georg Brandl ]
* fixup test for cfg_editor utils to run from non-checkout, and fix names, and remove example code * fixup test for cfg_editor utils to run from non-checkout, and fix names, and remove example code
@@ -27,7 +88,7 @@ frappy-core (0.20.3) jammy; urgency=medium
-- Georg Brandl <jenkins@frm2.tum.de> Thu, 07 Nov 2024 10:57:11 +0100 -- Georg Brandl <jenkins@frm2.tum.de> Thu, 07 Nov 2024 10:57:11 +0100
frappy-core (0.20.2) jammy; urgency=medium frappy-core (0.20.2) stable; urgency=medium
[ Georg Brandl ] [ Georg Brandl ]
* pylint: do not try to infer too much * pylint: do not try to infer too much
@@ -73,7 +134,7 @@ frappy-core (0.20.2) jammy; urgency=medium
-- Georg Brandl <jenkins@frm2.tum.de> Wed, 06 Nov 2024 10:40:26 +0100 -- Georg Brandl <jenkins@frm2.tum.de> Wed, 06 Nov 2024 10:40:26 +0100
frappy-core (0.20.1) jammy; urgency=medium frappy-core (0.20.1) stable; urgency=medium
* gui: do not add a console logger when there is no sys.stdout * gui: do not add a console logger when there is no sys.stdout
* remove unused test class * remove unused test class
@@ -83,7 +144,7 @@ frappy-core (0.20.1) jammy; urgency=medium
-- Georg Brandl <jenkins@frm2.tum.de> Thu, 17 Oct 2024 16:31:27 +0200 -- Georg Brandl <jenkins@frm2.tum.de> Thu, 17 Oct 2024 16:31:27 +0200
frappy-core (0.20.0) jammy; urgency=medium frappy-core (0.20.0) stable; urgency=medium
[ Alexander Zaft ] [ Alexander Zaft ]
* bin: remove make_doc * bin: remove make_doc
@@ -128,7 +189,7 @@ frappy-core (0.20.0) jammy; urgency=medium
-- Alexander Zaft <jenkins@frm2.tum.de> Thu, 17 Oct 2024 14:24:29 +0200 -- Alexander Zaft <jenkins@frm2.tum.de> Thu, 17 Oct 2024 14:24:29 +0200
frappy-core (0.19.10) jammy; urgency=medium frappy-core (0.19.10) stable; urgency=medium
[ Alexander Zaft ] [ Alexander Zaft ]
* debian: let frappy-core replace frappy-demo * debian: let frappy-core replace frappy-demo
@@ -138,25 +199,25 @@ frappy-core (0.19.10) jammy; urgency=medium
-- Alexander Zaft <jenkins@frm2.tum.de> Wed, 07 Aug 2024 17:00:06 +0200 -- Alexander Zaft <jenkins@frm2.tum.de> Wed, 07 Aug 2024 17:00:06 +0200
frappy-core (0.19.9) jammy; urgency=medium frappy-core (0.19.9) stable; urgency=medium
* debian: fix missing install dir * debian: fix missing install dir
-- Georg Brandl <jenkins@frm2.tum.de> Tue, 06 Aug 2024 16:02:50 +0200 -- Georg Brandl <jenkins@frm2.tum.de> Tue, 06 Aug 2024 16:02:50 +0200
frappy-core (0.19.8) jammy; urgency=medium frappy-core (0.19.8) stable; urgency=medium
* debian: move demo into core * debian: move demo into core
-- Georg Brandl <jenkins@frm2.tum.de> Tue, 06 Aug 2024 15:58:20 +0200 -- Georg Brandl <jenkins@frm2.tum.de> Tue, 06 Aug 2024 15:58:20 +0200
frappy-core (0.19.7) jammy; urgency=medium frappy-core (0.19.7) stable; urgency=medium
* lib: GeneralConfig fix missing keys logic * lib: GeneralConfig fix missing keys logic
-- Alexander Zaft <jenkins@frm2.tum.de> Tue, 06 Aug 2024 15:04:07 +0200 -- Alexander Zaft <jenkins@frm2.tum.de> Tue, 06 Aug 2024 15:04:07 +0200
frappy-core (0.19.6) jammy; urgency=medium frappy-core (0.19.6) stable; urgency=medium
[ Jens Krüger ] [ Jens Krüger ]
* SINQ/SEA: Fix import error due to None value * SINQ/SEA: Fix import error due to None value
@@ -170,7 +231,7 @@ frappy-core (0.19.6) jammy; urgency=medium
-- Jens Krüger <jenkins@frm2.tum.de> Tue, 06 Aug 2024 13:56:51 +0200 -- Jens Krüger <jenkins@frm2.tum.de> Tue, 06 Aug 2024 13:56:51 +0200
frappy-core (0.19.5) jammy; urgency=medium frappy-core (0.19.5) stable; urgency=medium
* client: fix how to raise error on wrong ident * client: fix how to raise error on wrong ident
* add missing requirements to setup.py * add missing requirements to setup.py
@@ -179,13 +240,13 @@ frappy-core (0.19.5) jammy; urgency=medium
-- Alexander Zaft <jenkins@frm2.tum.de> Mon, 05 Aug 2024 09:30:53 +0200 -- Alexander Zaft <jenkins@frm2.tum.de> Mon, 05 Aug 2024 09:30:53 +0200
frappy-core (0.19.4) jammy; urgency=medium frappy-core (0.19.4) stable; urgency=medium
* actually exclude cfg-editor * actually exclude cfg-editor
-- Georg Brandl <jenkins@frm2.tum.de> Fri, 26 Jul 2024 11:46:10 +0200 -- Georg Brandl <jenkins@frm2.tum.de> Fri, 26 Jul 2024 11:46:10 +0200
frappy-core (0.19.3) jammy; urgency=medium frappy-core (0.19.3) stable; urgency=medium
[ Markus Zolliker ] [ Markus Zolliker ]
* frappy_psi.extparams.StructParam: fix doc + simplify * frappy_psi.extparams.StructParam: fix doc + simplify
@@ -205,7 +266,7 @@ frappy-core (0.19.3) jammy; urgency=medium
-- Markus Zolliker <jenkins@frm2.tum.de> Fri, 26 Jul 2024 08:36:43 +0200 -- Markus Zolliker <jenkins@frm2.tum.de> Fri, 26 Jul 2024 08:36:43 +0200
frappy-core (0.19.2) jammy; urgency=medium frappy-core (0.19.2) stable; urgency=medium
[ l_samenv ] [ l_samenv ]
* fix missing update after error on parameter * fix missing update after error on parameter
@@ -230,7 +291,7 @@ frappy-core (0.19.2) jammy; urgency=medium
-- l_samenv <jenkins@frm2.tum.de> Tue, 18 Jun 2024 15:21:43 +0200 -- l_samenv <jenkins@frm2.tum.de> Tue, 18 Jun 2024 15:21:43 +0200
frappy-core (0.19.1) jammy; urgency=medium frappy-core (0.19.1) stable; urgency=medium
[ Markus Zolliker ] [ Markus Zolliker ]
* SecopClient.online must be True while activating * SecopClient.online must be True while activating
@@ -242,7 +303,7 @@ frappy-core (0.19.1) jammy; urgency=medium
-- Markus Zolliker <jenkins@frm2.tum.de> Fri, 07 Jun 2024 16:50:33 +0200 -- Markus Zolliker <jenkins@frm2.tum.de> Fri, 07 Jun 2024 16:50:33 +0200
frappy-core (0.19.0) jammy; urgency=medium frappy-core (0.19.0) stable; urgency=medium
[ Markus Zolliker ] [ Markus Zolliker ]
* simulation: extra_params might be a list * simulation: extra_params might be a list
@@ -298,14 +359,14 @@ frappy-core (0.19.0) jammy; urgency=medium
-- Markus Zolliker <jenkins@frm2.tum.de> Thu, 16 May 2024 11:31:25 +0200 -- Markus Zolliker <jenkins@frm2.tum.de> Thu, 16 May 2024 11:31:25 +0200
frappy-core (0.18.1) focal; urgency=medium frappy-core (0.18.1) stable; urgency=medium
* mlz: Zapf fix unit handling and small errors * mlz: Zapf fix unit handling and small errors
* mlz: entangle fix limit check * mlz: entangle fix limit check
-- Alexander Zaft <jenkins@frm2.tum.de> Wed, 24 Jan 2024 14:59:21 +0100 -- Alexander Zaft <jenkins@frm2.tum.de> Wed, 24 Jan 2024 14:59:21 +0100
frappy-core (0.18.0) focal; urgency=medium frappy-core (0.18.0) stable; urgency=medium
[ Alexander Zaft ] [ Alexander Zaft ]
* Add shutdownModule function * Add shutdownModule function
@@ -416,7 +477,7 @@ frappy-core (0.18.0) focal; urgency=medium
-- Alexander Zaft <jenkins@frm2.tum.de> Wed, 17 Jan 2024 12:35:00 +0100 -- Alexander Zaft <jenkins@frm2.tum.de> Wed, 17 Jan 2024 12:35:00 +0100
frappy-core (0.17.13) focal; urgency=medium frappy-core (0.17.13) stable; urgency=medium
[ Alexander Zaft ] [ Alexander Zaft ]
* add egg-info to gitignore * add egg-info to gitignore
@@ -437,7 +498,7 @@ frappy-core (0.17.13) focal; urgency=medium
-- Alexander Zaft <jenkins@frm2.tum.de> Tue, 20 Jun 2023 14:38:00 +0200 -- Alexander Zaft <jenkins@frm2.tum.de> Tue, 20 Jun 2023 14:38:00 +0200
frappy-core (0.17.12) focal; urgency=medium frappy-core (0.17.12) stable; urgency=medium
[ Alexander Zaft ] [ Alexander Zaft ]
* Warn about duplicate module definitions in a file * Warn about duplicate module definitions in a file
@@ -462,7 +523,7 @@ frappy-core (0.17.12) focal; urgency=medium
-- Alexander Zaft <jenkins@frm2.tum.de> Tue, 13 Jun 2023 06:51:27 +0200 -- Alexander Zaft <jenkins@frm2.tum.de> Tue, 13 Jun 2023 06:51:27 +0200
frappy-core (0.17.11) focal; urgency=medium frappy-core (0.17.11) stable; urgency=medium
[ Alexander Zaft ] [ Alexander Zaft ]
* Add __format__ to EnumMember * Add __format__ to EnumMember
@@ -535,7 +596,7 @@ frappy-core (0.17.11) focal; urgency=medium
-- Alexander Zaft <jenkins@frm2.tum.de> Thu, 25 May 2023 09:38:24 +0200 -- Alexander Zaft <jenkins@frm2.tum.de> Thu, 25 May 2023 09:38:24 +0200
frappy-core (0.17.10) focal; urgency=medium frappy-core (0.17.10) stable; urgency=medium
* Change leftover %-logging calls to lazy * Change leftover %-logging calls to lazy
* Convert formatting automatically to f-strings * Convert formatting automatically to f-strings
@@ -547,25 +608,25 @@ frappy-core (0.17.10) focal; urgency=medium
-- Alexander Zaft <jenkins@frm2.tum.de> Wed, 19 Apr 2023 14:32:52 +0200 -- Alexander Zaft <jenkins@frm2.tum.de> Wed, 19 Apr 2023 14:32:52 +0200
frappy-core (0.17.9) focal; urgency=medium frappy-core (0.17.9) stable; urgency=medium
* interactive client: avoid messing up the input line * interactive client: avoid messing up the input line
-- Markus Zolliker <jenkins@frm2.tum.de> Tue, 11 Apr 2023 16:09:03 +0200 -- Markus Zolliker <jenkins@frm2.tum.de> Tue, 11 Apr 2023 16:09:03 +0200
frappy-core (0.17.8) focal; urgency=medium frappy-core (0.17.8) stable; urgency=medium
* Debian: Fix typo * Debian: Fix typo
-- Jens Krüger <jenkins@frm2.tum.de> Wed, 05 Apr 2023 07:20:25 +0200 -- Jens Krüger <jenkins@frm2.tum.de> Wed, 05 Apr 2023 07:20:25 +0200
frappy-core (0.17.7) focal; urgency=medium frappy-core (0.17.7) stable; urgency=medium
* Debian: add pyqtgraph dependency * Debian: add pyqtgraph dependency
-- Jens Krüger <jenkins@frm2.tum.de> Wed, 05 Apr 2023 07:07:24 +0200 -- Jens Krüger <jenkins@frm2.tum.de> Wed, 05 Apr 2023 07:07:24 +0200
frappy-core (0.17.6) focal; urgency=medium frappy-core (0.17.6) stable; urgency=medium
[ Alexander Zaft ] [ Alexander Zaft ]
* gui: show parameter properties again * gui: show parameter properties again
@@ -585,25 +646,25 @@ frappy-core (0.17.6) focal; urgency=medium
-- Alexander Zaft <jenkins@frm2.tum.de> Tue, 04 Apr 2023 08:42:26 +0200 -- Alexander Zaft <jenkins@frm2.tum.de> Tue, 04 Apr 2023 08:42:26 +0200
frappy-core (0.17.5) focal; urgency=medium frappy-core (0.17.5) stable; urgency=medium
* Fix generator * Fix generator
-- Alexander Zaft <jenkins@frm2.tum.de> Wed, 22 Mar 2023 12:32:06 +0100 -- Alexander Zaft <jenkins@frm2.tum.de> Wed, 22 Mar 2023 12:32:06 +0100
frappy-core (0.17.4) focal; urgency=medium frappy-core (0.17.4) stable; urgency=medium
* Fix entangle integration bugs * Fix entangle integration bugs
-- Alexander Zaft <jenkins@frm2.tum.de> Wed, 22 Mar 2023 11:44:34 +0100 -- Alexander Zaft <jenkins@frm2.tum.de> Wed, 22 Mar 2023 11:44:34 +0100
frappy-core (0.17.3) focal; urgency=medium frappy-core (0.17.3) stable; urgency=medium
* UNRELEASED * UNRELEASED
-- Alexander Zaft <jenkins@frm2.tum.de> Tue, 21 Mar 2023 15:55:09 +0100 -- Alexander Zaft <jenkins@frm2.tum.de> Tue, 21 Mar 2023 15:55:09 +0100
frappy-core (0.17.2) focal; urgency=medium frappy-core (0.17.2) stable; urgency=medium
[ Alexander Zaft ] [ Alexander Zaft ]
* Fix Simulation and Proxy * Fix Simulation and Proxy
@@ -740,7 +801,7 @@ frappy-core (0.17.2) focal; urgency=medium
-- Alexander Zaft <jenkins@frm2.tum.de> Tue, 21 Mar 2023 15:49:06 +0100 -- Alexander Zaft <jenkins@frm2.tum.de> Tue, 21 Mar 2023 15:49:06 +0100
frappy-core (0.17.1) focal; urgency=medium frappy-core (0.17.1) stable; urgency=medium
[ Georg Brandl ] [ Georg Brandl ]
* gitignore: ignore demo PID file * gitignore: ignore demo PID file
@@ -759,7 +820,7 @@ frappy-core (0.17.1) focal; urgency=medium
-- Georg Brandl <jenkins@frm2.tum.de> Tue, 21 Feb 2023 17:44:56 +0100 -- Georg Brandl <jenkins@frm2.tum.de> Tue, 21 Feb 2023 17:44:56 +0100
frappy-core (0.17.0) focal; urgency=medium frappy-core (0.17.0) stable; urgency=medium
[ Alexander Zaft ] [ Alexander Zaft ]
* Rework GUI. * Rework GUI.
@@ -770,37 +831,37 @@ frappy-core (0.17.0) focal; urgency=medium
-- Alexander Zaft <jenkins@frm2.tum.de> Tue, 21 Feb 2023 13:52:17 +0100 -- Alexander Zaft <jenkins@frm2.tum.de> Tue, 21 Feb 2023 13:52:17 +0100
frappy-core (0.16.1) focal; urgency=medium frappy-core (0.16.1) stable; urgency=medium
* UNRELEASED * UNRELEASED
-- Georg Brandl <jenkins@frm2.tum.de> Tue, 21 Feb 2023 08:44:28 +0100 -- Georg Brandl <jenkins@frm2.tum.de> Tue, 21 Feb 2023 08:44:28 +0100
frappy-core (0.16.4) focal; urgency=medium frappy-core (0.16.4) stable; urgency=medium
* UNRELEASED * UNRELEASED
-- Georg Brandl <jenkins@frm2.tum.de> Tue, 21 Feb 2023 08:09:20 +0100 -- Georg Brandl <jenkins@frm2.tum.de> Tue, 21 Feb 2023 08:09:20 +0100
frappy-core (0.16.3) focal; urgency=medium frappy-core (0.16.3) stable; urgency=medium
* UNRELEASED * UNRELEASED
-- Georg Brandl <jenkins@frm2.tum.de> Tue, 21 Feb 2023 08:00:15 +0100 -- Georg Brandl <jenkins@frm2.tum.de> Tue, 21 Feb 2023 08:00:15 +0100
frappy-core (0.16.2) focal; urgency=medium frappy-core (0.16.2) stable; urgency=medium
* gui: move icon resources for the cfg editor to its subdirectory * gui: move icon resources for the cfg editor to its subdirectory
-- Georg Brandl <jenkins@frm2.tum.de> Tue, 21 Feb 2023 07:50:13 +0100 -- Georg Brandl <jenkins@frm2.tum.de> Tue, 21 Feb 2023 07:50:13 +0100
frappy-core (0.16.1) focal; urgency=medium frappy-core (0.16.1) stable; urgency=medium
* add frappy-cli to package * add frappy-cli to package
-- Enrico Faulhaber <jenkins@frm2.tum.de> Mon, 20 Feb 2023 17:17:23 +0100 -- Enrico Faulhaber <jenkins@frm2.tum.de> Mon, 20 Feb 2023 17:17:23 +0100
frappy-core (0.16.0) focal; urgency=medium frappy-core (0.16.0) stable; urgency=medium
[ Enrico Faulhaber ] [ Enrico Faulhaber ]
* fix sorce package name * fix sorce package name
@@ -862,7 +923,7 @@ frappy-core (0.16.0) focal; urgency=medium
-- Enrico Faulhaber <jenkins@frm2.tum.de> Mon, 20 Feb 2023 16:15:10 +0100 -- Enrico Faulhaber <jenkins@frm2.tum.de> Mon, 20 Feb 2023 16:15:10 +0100
frappy-core (0.15.0) focal; urgency=medium frappy-core (0.15.0) stable; urgency=medium
[ Björn Pedersen ] [ Björn Pedersen ]
* Remove iohandler left-overs from docs * Remove iohandler left-overs from docs
@@ -892,7 +953,7 @@ frappy-core (0.15.0) focal; urgency=medium
-- Björn Pedersen <jenkins@frm2.tum.de> Thu, 10 Nov 2022 14:46:01 +0100 -- Björn Pedersen <jenkins@frm2.tum.de> Thu, 10 Nov 2022 14:46:01 +0100
secop-core (0.14.3) focal; urgency=medium secop-core (0.14.3) stable; urgency=medium
[ Enrico Faulhaber ] [ Enrico Faulhaber ]
* change repo to secop/frappy * change repo to secop/frappy
@@ -908,13 +969,13 @@ secop-core (0.14.3) focal; urgency=medium
-- Enrico Faulhaber <jenkins@frm2.tum.de> Thu, 03 Nov 2022 13:51:52 +0100 -- Enrico Faulhaber <jenkins@frm2.tum.de> Thu, 03 Nov 2022 13:51:52 +0100
secop-core (0.14.2) focal; urgency=medium secop-core (0.14.2) stable; urgency=medium
* systemd generator: adapt to changed config API * systemd generator: adapt to changed config API
-- Georg Brandl <jenkins@frm2.tum.de> Thu, 20 Oct 2022 15:38:45 +0200 -- Georg Brandl <jenkins@frm2.tum.de> Thu, 20 Oct 2022 15:38:45 +0200
secop-core (0.14.1) focal; urgency=medium secop-core (0.14.1) stable; urgency=medium
[ Markus Zolliker ] [ Markus Zolliker ]
* secop_psi.entangle.AnalogInput: fix main value * secop_psi.entangle.AnalogInput: fix main value
@@ -926,7 +987,7 @@ secop-core (0.14.1) focal; urgency=medium
-- Markus Zolliker <jenkins@frm2.tum.de> Thu, 20 Oct 2022 14:04:07 +0200 -- Markus Zolliker <jenkins@frm2.tum.de> Thu, 20 Oct 2022 14:04:07 +0200
secop-core (0.14.0) focal; urgency=medium secop-core (0.14.0) stable; urgency=medium
* add simple interactive python client * add simple interactive python client
* fix undefined status in softcal * fix undefined status in softcal
@@ -940,7 +1001,7 @@ secop-core (0.14.0) focal; urgency=medium
-- Markus Zolliker <jenkins@frm2.tum.de> Wed, 19 Oct 2022 11:31:50 +0200 -- Markus Zolliker <jenkins@frm2.tum.de> Wed, 19 Oct 2022 11:31:50 +0200
secop-core (0.13.1) focal; urgency=medium secop-core (0.13.1) stable; urgency=medium
[ Markus Zolliker ] [ Markus Zolliker ]
* an enum with value 0 should be interpreted as False * an enum with value 0 should be interpreted as False
@@ -951,7 +1012,7 @@ secop-core (0.13.1) focal; urgency=medium
-- Markus Zolliker <jenkins@jenkins02.admin.frm2.tum.de> Tue, 02 Aug 2022 15:31:52 +0200 -- Markus Zolliker <jenkins@jenkins02.admin.frm2.tum.de> Tue, 02 Aug 2022 15:31:52 +0200
secop-core (0.13.0) focal; urgency=medium secop-core (0.13.0) stable; urgency=medium
[ Georg Brandl ] [ Georg Brandl ]
* debian: fix email addresses in changelog * debian: fix email addresses in changelog
@@ -1014,13 +1075,13 @@ secop-core (0.13.0) focal; urgency=medium
-- Georg Brandl <jenkins@frm2.tum.de> Tue, 02 Aug 2022 09:47:06 +0200 -- Georg Brandl <jenkins@frm2.tum.de> Tue, 02 Aug 2022 09:47:06 +0200
secop-core (0.12.4) focal; urgency=medium secop-core (0.12.4) stable; urgency=medium
* fix command inheritance * fix command inheritance
-- Markus Zolliker <jenkins@jenkins01.admin.frm2.tum.de> Thu, 11 Nov 2021 16:21:19 +0100 -- Markus Zolliker <jenkins@jenkins01.admin.frm2.tum.de> Thu, 11 Nov 2021 16:21:19 +0100
secop-core (0.12.3) focal; urgency=medium secop-core (0.12.3) stable; urgency=medium
[ Georg Brandl ] [ Georg Brandl ]
* Makefile: fix docker image * Makefile: fix docker image
@@ -1043,7 +1104,7 @@ secop-core (0.12.3) focal; urgency=medium
-- Georg Brandl <jenkins@jenkins01.admin.frm2.tum.de> Wed, 10 Nov 2021 16:33:19 +0100 -- Georg Brandl <jenkins@jenkins01.admin.frm2.tum.de> Wed, 10 Nov 2021 16:33:19 +0100
secop-core (0.12.2) focal; urgency=medium secop-core (0.12.2) stable; urgency=medium
[ Markus Zolliker ] [ Markus Zolliker ]
* fix issue with new syntax in simulation * fix issue with new syntax in simulation
@@ -1055,13 +1116,13 @@ secop-core (0.12.2) focal; urgency=medium
-- Markus Zolliker <jenkins@jenkins01.admin.frm2.tum.de> Tue, 18 May 2021 10:29:17 +0200 -- Markus Zolliker <jenkins@jenkins01.admin.frm2.tum.de> Tue, 18 May 2021 10:29:17 +0200
secop-core (0.12.1) focal; urgency=medium secop-core (0.12.1) stable; urgency=medium
* remove secop-console from debian *.install file * remove secop-console from debian *.install file
-- Enrico Faulhaber <jenkins@jenkins02.admin.frm2.tum.de> Tue, 04 May 2021 09:42:53 +0200 -- Enrico Faulhaber <jenkins@jenkins02.admin.frm2.tum.de> Tue, 04 May 2021 09:42:53 +0200
secop-core (0.12.0) focal; urgency=medium secop-core (0.12.0) stable; urgency=medium
[ Markus Zolliker ] [ Markus Zolliker ]
* make datatypes immutable * make datatypes immutable

1
debian/compat vendored
View File

@@ -1 +0,0 @@
11

5
debian/control vendored
View File

@@ -2,14 +2,13 @@ Source: frappy-core
Section: contrib/misc Section: contrib/misc
Priority: optional Priority: optional
Maintainer: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de> Maintainer: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Build-Depends: debhelper (>= 11~), Build-Depends: debhelper-compat (= 13),
dh-python, dh-python,
python3 (>=3.6), python3 (>=3.6),
python3-all, python3-all,
python3-setuptools, python3-setuptools,
python3-docutils, python3-docutils,
python3-sphinx, python3-sphinx,
python3-sip-dev,
python3-pyqt5, python3-pyqt5,
python3-mlzlog, python3-mlzlog,
python3-numpy, python3-numpy,
@@ -20,7 +19,7 @@ Build-Depends: debhelper (>= 11~),
git, git,
markdown, markdown,
python3-daemon python3-daemon
Standards-Version: 4.1.4 Standards-Version: 4.6.2
X-Python3-Version: >= 3.6 X-Python3-Version: >= 3.6
Package: frappy-core Package: frappy-core

View File

@@ -10,6 +10,6 @@ usr/lib/python3.*/dist-packages/frappy/protocol
usr/lib/python3.*/dist-packages/frappy_core-* usr/lib/python3.*/dist-packages/frappy_core-*
usr/lib/python3.*/dist-packages/frappy/RELEASE-VERSION usr/lib/python3.*/dist-packages/frappy/RELEASE-VERSION
usr/lib/python3.*/dist-packages/frappy_demo usr/lib/python3.*/dist-packages/frappy_demo
lib/systemd usr/lib/systemd
var/log/frappy var/log/frappy
etc/frappy/generalConfig.cfg etc/generalConfig.cfg etc/frappy

16
debian/rules vendored
View File

@@ -1,19 +1,13 @@
#!/usr/bin/make -f #!/usr/bin/make -f
# -*- makefile -*-
# Uncomment this to turn on verbose mode. # Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1 #export DH_VERBOSE=1
export PYBUILD_NAME=frappy # needed for bookworm compatibility!
export PYBUILD_TEST_PYTEST=1 override_dh_installsystemd:
ln -s usr/lib debian/frappy-core/lib
override_dh_install: dh_installsystemd
rmdir debian/tmp rm debian/frappy-core/lib
mv debian/python3-frappy debian/tmp
install -m644 -Dt debian/tmp/etc/frappy etc/generalConfig.cfg
dh_install -i -O--buildsystem=pybuild
dh_missing --fail-missing
%: %:
dh $@ --with python3 --buildsystem=pybuild dh $@ --with python3 --buildsystem=pybuild

View File

@@ -35,7 +35,7 @@ def main():
generalConfig.init() generalConfig.init()
config_dir = generalConfig['confdir'] config_dir = generalConfig['confdir']
frappy_unit = '/lib/systemd/system/frappy@.service' frappy_unit = '/usr/lib/systemd/system/frappy@.service'
wants_dir = normal_dir + '/frappy.target.wants' wants_dir = normal_dir + '/frappy.target.wants'
all_servers = [base[:-4] if base.endswith('_cfg') else base for (base, ext) in all_servers = [base[:-4] if base.endswith('_cfg') else base for (base, ext) in

75
frappy/addrparam.py Normal file
View File

@@ -0,0 +1,75 @@
# *****************************************************************************
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Markus Zolliker <markus.zolliker@psi.ch>
#
# *****************************************************************************
from frappy.core import Parameter, Property
from frappy.datatypes import ValueType
class AddrParam(Parameter):
"""parameter with an address field
instead of implementing read_<param> and write_<param>, just implement
addressed_read and addressed_write.
"""
addr = Property('address', ValueType())
class AddrMixin:
"""mixin for addressed parameters
in case a read_<param> and/or write_<param> are not implemented,
they are created with a call to addressed_read and/or addressed_write
"""
def __init_subclass__(cls):
for aname, aobj in list(cls.__dict__.items()):
if isinstance(aobj, AddrParam):
methodname = f'read_{aname}'
if not hasattr(cls, methodname):
def rfunc(self, pname=aname):
return self.addressed_read(self.accessibles[pname])
setattr(cls, methodname, rfunc)
if not aobj.readonly:
methodname = f'write_{aname}'
if not hasattr(cls, methodname):
def wfunc(self, value, pname=aname):
return self.addressed_write(self.accessibles[pname], value)
setattr(cls, methodname, wfunc)
super().__init_subclass__()
def addressed_read(self, pobj):
"""addressed read
:param pobj: the AddrParam
:return: the value read
"""
return getattr(self, pobj.name)
def addressed_write(self, pobj, value):
"""addressed write
:param pobj: the AddrParam
:param value: the value to be written
:return: the value written or None
"""

131
frappy/attached.py Normal file
View File

@@ -0,0 +1,131 @@
# *****************************************************************************
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
# Markus Zolliker <markus.zolliker@psi.ch>
# Alexander Zaft <a.zaft@fz-juelich.de>
#
# *****************************************************************************
from frappy.errors import ConfigError
from frappy.modulebase import Module
from frappy.datatypes import StringType, ValueType
from frappy.properties import Property
class Attached(Property):
"""a special property, defining an attached module
assign a module name to this property in the cfg file,
and the server will create an attribute with this module
When mandatory is set to False, and there is no value or an empty string
given in the config file, the value of the attribute will be None.
"""
def __init__(self, basecls=Module, description='attached module', mandatory=True):
self.basecls = basecls
super().__init__(description, StringType(), mandatory=mandatory)
def __get__(self, obj, owner):
if obj is None:
return self
modobj = obj.attachedModules.get(self.name)
if not modobj:
modulename = super().__get__(obj, owner)
if not modulename:
return None # happens when mandatory=False and modulename is not given
modobj = obj.secNode.get_module(modulename)
if not modobj:
raise ConfigError(f'attached module {self.name}={modulename!r} '
f'does not exist')
if not isinstance(modobj, self.basecls):
raise ConfigError(f'attached module {self.name}={modobj.name!r} '
f'must inherit from {self.basecls.__qualname__!r}')
obj.attachedModules[self.name] = modobj
return modobj
def copy(self):
return Attached(self.basecls, self.description, self.mandatory)
class DictWithFlag(dict):
flag = False
class AttachDictType(ValueType):
"""a custom datatype for a dict <key> of names or modules"""
def __init__(self):
super().__init__(DictWithFlag)
def copy(self):
return AttachDictType()
def export_value(self, value):
"""export either names or the name attribute
to treat bare names and modules the same
"""
return {k: getattr(v, 'name', v) for k, v in value.items()}
class AttachedDict(Property):
def __init__(self, description='attached modules', elements=None, optional=None, basecls=None,
**kwds):
"""a mapping of attached modules
:param elements: None or a dict <key> of <basecls> for mandatory elements
:param optional: None or a dict <key> of <basecls> for optional elements
:param basecls: None or a base class for arbitrary keys
if not given, only keys given in parameters 'elements' and 'optional' are allowed
:param description: the property description
<key> might also be a number or any other immutable
"""
self.elements = elements or {}
self.basecls = basecls
self.baseclasses = {**self.elements, **(optional or {})}
super().__init__(description, AttachDictType(), default={}, **kwds)
def __get__(self, obj, owner):
if obj is None:
return self
attach_dict = super().__get__(obj, owner) or DictWithFlag({})
if attach_dict.flag:
return attach_dict
for key, modulename in attach_dict.items():
basecls = self.baseclasses.get(key, self.basecls)
if basecls is None:
raise ConfigError(f'unknown key {key!r} for attached modules {self.name}')
modobj = obj.secNode.get_module(modulename)
if modobj is None:
raise ConfigError(f'attached modules {self.name}: '
f'{key}={modulename!r} does not exist')
if not isinstance(modobj, basecls):
raise ConfigError(f'attached modules {self.name}: '
f'module {key}={modulename!r} must inherit '
f'from {basecls.__qualname__!r}')
obj.attachedModules[self.name, key] = attach_dict[key] = modobj
missing_keys = set(self.elements) - set(attach_dict)
if missing_keys:
raise ConfigError(f'attached modules {self.name}: '
f"missing {', '.join(missing_keys)} ")
attach_dict.flag = True
return attach_dict
def copy(self):
return AttachedDict(self.elements, self.baseclasses, self.basecls, self.description)

View File

@@ -209,16 +209,20 @@ class ProxyClient:
# caches (module, parameter) = value, timestamp, readerror (internal names!) # caches (module, parameter) = value, timestamp, readerror (internal names!)
self.cache = Cache() # dict returning Cache.undefined for missing keys self.cache = Cache() # dict returning Cache.undefined for missing keys
def register_callback(self, key, *args, callimmediately=None, **kwds): def register_callback(self, key, *args, callimmediately=True, **kwds):
"""register callback functions """register callback functions
- key might be either: several callbacks might be registered within one call.
ProxyClient.CALLBACK_NAMES contains all names of valid callbacks
:param key: might be either:
1) None: general callback (all callbacks) 1) None: general callback (all callbacks)
2) <module name>: callbacks related to a module (not called for 'unhandledMessage') 2) <module name>: callbacks related to a module (not called for 'unhandledMessage')
3) (<module name>, <parameter name>): callback for specified parameter (only called for 'updateEvent') 3) (<module name>, <parameter name>): callback for specified parameter
- all the following arguments are callback functions. The callback name may be (only called for 'updateEvent' and 'updateItem')
given by the keyword, or, for non-keyworded arguments it is taken from the :param args: callback functions. the callback name is taken from the the __name__ attribute of the function
__name__ attribute of the function :param callimmediately: True (default): call immediately for updateItem and updateEvent callbacks
:param kwds: callback functions. the callback name is taken from the key
""" """
for cbfunc in args: for cbfunc in args:
kwds[cbfunc.__name__] = cbfunc kwds[cbfunc.__name__] = cbfunc
@@ -226,8 +230,8 @@ class ProxyClient:
if cbname not in self.CALLBACK_NAMES: if cbname not in self.CALLBACK_NAMES:
raise TypeError(f"unknown callback: {', '.join(kwds)}") raise TypeError(f"unknown callback: {', '.join(kwds)}")
# immediately call for some callback types # call immediately for some callback types
if cbname in ('updateItem', 'updateEvent') and callimmediately is not False: if cbname in ('updateItem', 'updateEvent') and callimmediately:
if key is None: # case generic callback if key is None: # case generic callback
cbargs = [(m, p, d) for (m, p), d in self.cache.items()] cbargs = [(m, p, d) for (m, p), d in self.cache.items()]
else: else:
@@ -734,7 +738,7 @@ class SecopClient(ProxyClient):
""" """
self.connect() # make sure we are connected self.connect() # make sure we are connected
datatype = self.modules[module]['parameters'][parameter]['datatype'] datatype = self.modules[module]['parameters'][parameter]['datatype']
value = datatype.from_string(formatted) value = datatype.export_value(datatype.from_string(formatted))
self.request(WRITEREQUEST, self.identifier[module, parameter], value) self.request(WRITEREQUEST, self.identifier[module, parameter], value)
return self.cache[module, parameter] return self.cache[module, parameter]
@@ -753,6 +757,28 @@ class SecopClient(ProxyClient):
data = datatype.import_value(data) data = datatype.import_value(data)
return data, qualifiers return data, qualifiers
def execCommandFromString(self, module, command, formatted_argument=''):
"""call command from string argument
return data as CacheItem which allows to get
- result.value # the python value
- result.formatted() # a string (incl. units)
- result.timestamp
"""
self.connect()
datatype = self.modules[module]['commands'][command]['datatype'].argument
if datatype:
argument = datatype.from_string(formatted_argument)
else:
if formatted_argument:
raise WrongTypeError('command has no argument')
argument = None
# pylint: disable=unsubscriptable-object
data, qualifiers = self.request(COMMANDREQUEST, self.identifier[module, command], argument)[2]
datatype = self.modules[module]['commands'][command]['datatype'].result
value = datatype.import_value(data) if datatype else None
return CacheItem(value, qualifiers.get('t'), None, datatype)
def updateValue(self, module, param, value, timestamp, readerror): def updateValue(self, module, param, value, timestamp, readerror):
datatype = self.modules[module]['parameters'][param]['datatype'] datatype = self.modules[module]['parameters'][param]['datatype']
if readerror: if readerror:

View File

@@ -29,7 +29,7 @@ import os
import traceback import traceback
import threading import threading
import logging import logging
from os.path import expanduser from pathlib import Path
from frappy.lib import delayed_import from frappy.lib import delayed_import
from frappy.client import SecopClient, UnregisterCallback from frappy.client import SecopClient, UnregisterCallback
from frappy.errors import SECoPError from frappy.errors import SECoPError
@@ -64,6 +64,8 @@ LOG_LEVELS = {
'off': logging.ERROR+1} 'off': logging.ERROR+1}
CLR = '\r\x1b[K' # code to move to the left and clear current line CLR = '\r\x1b[K' # code to move to the left and clear current line
UNDEF = object()
class Handler(logging.StreamHandler): class Handler(logging.StreamHandler):
def emit(self, record): def emit(self, record):
@@ -143,7 +145,7 @@ class Module:
def _isBusy(self): def _isBusy(self):
return self.status[0] // 100 == StatusType.BUSY // 100 return self.status[0] // 100 == StatusType.BUSY // 100
def _status_value_update(self, m, p, status, t, e): def _status_update(self, m, p, status, t, e):
if self._is_driving and not self._isBusy(): if self._is_driving and not self._isBusy():
self._is_driving = False self._is_driving = False
self._driving_event.set() self._driving_event.set()
@@ -213,15 +215,24 @@ class Module:
clientenv.raise_with_short_traceback(error) clientenv.raise_with_short_traceback(error)
return value return value
def __call__(self, target=None): def __call__(self, target=UNDEF):
if target is None: if target is UNDEF:
return self.read() return self.read()
for pname in 'value', 'status': watch_params = ['value', 'status']
for pname in watch_params:
self._secnode.register_callback((self._name, pname), self._secnode.register_callback((self._name, pname),
callimmediately=False, updateEvent=self._watch_parameter,
updateEvent=self._watch_parameter) callimmediately=False)
self.target = target # this sets self._is_driving if 'go' in self._commands:
if 'goal' in self._parameters and target is not None:
self.goal_enable = True
self.goal = target
if 'target' in self._parameters:
self.target = target
self.go()
elif 'target' in self._parameters:
self.target = target # this sets self._is_driving
def loop(): def loop():
while self._is_driving: while self._is_driving:
@@ -229,9 +240,12 @@ class Module:
self._driving_event.clear() self._driving_event.clear()
try: try:
loop() loop()
except KeyboardInterrupt as e: except KeyboardInterrupt:
self._secnode.log.info('-- interrupted --') self._secnode.log.info('-- interrupted --')
self.stop() try:
self.stop()
except Exception as e:
print(f'while stopping: {e!r}')
try: try:
loop() # wait for stopping to be finished loop() # wait for stopping to be finished
except KeyboardInterrupt: except KeyboardInterrupt:
@@ -239,11 +253,10 @@ class Module:
pass pass
clientenv.raise_with_short_traceback(e) clientenv.raise_with_short_traceback(e)
finally: finally:
# self._watch_parameter(self._name, 'status')
self._secnode.readParameter(self._name, 'value') self._secnode.readParameter(self._name, 'value')
# self._watch_parameter(self._name, 'value', forced=True) for pname in watch_params:
self._secnode.unregister_callback((self._name, 'value'), updateEvent=self._watch_parameter) self._secnode.unregister_callback(
self._secnode.unregister_callback((self._name, 'status'), updateEvent=self._watch_parameter) (self._name, pname), updateEvent=self._watch_parameter)
return self.value return self.value
def __repr__(self): def __repr__(self):
@@ -297,6 +310,8 @@ class Param:
class Command: class Command:
_obj = None
def __init__(self, name, modname, secnode): def __init__(self, name, modname, secnode):
self.name = name self.name = name
self.modname = modname self.modname = modname
@@ -311,11 +326,14 @@ class Command:
result, _ = self.exec(self.modname, self.name, *args) result, _ = self.exec(self.modname, self.name, *args)
else: else:
result, _ = self.exec(self.modname, self.name, args or None) result, _ = self.exec(self.modname, self.name, args or None)
if self.name == 'go' and self._obj:
self._obj._is_driving = self._obj._isBusy()
return result return result
def __get__(self, obj, owner=None): def __get__(self, obj, owner=None):
if obj is None: if obj is None:
return self return self
self._obj = obj
return self.call return self.call
@@ -418,8 +436,7 @@ class Client(SecopClient):
attrs[cname] = Command(cname, modname, self) attrs[cname] = Command(cname, modname, self)
mobj = type(f'M_{modname}', (Module,), attrs)(modname, self) mobj = type(f'M_{modname}', (Module,), attrs)(modname, self)
if 'status' in mobj._parameters: if 'status' in mobj._parameters:
self.register_callback((modname, 'status'), updateEvent=mobj._status_value_update) self.register_callback((modname, 'status'), updateEvent=mobj._status_update)
self.register_callback((modname, 'value'), updateEvent=mobj._status_value_update)
clientenv.namespace[modname] = mobj clientenv.namespace[modname] = mobj
if removed_modules: if removed_modules:
self.log.info('removed modules: %s', ' '.join(removed_modules)) self.log.info('removed modules: %s', ' '.join(removed_modules))
@@ -450,7 +467,7 @@ def run(filepath):
"__file__": filepath, "__file__": filepath,
"__name__": "__main__", "__name__": "__main__",
}) })
with filepath.open('rb') as file: with open(filepath, 'rb') as file:
# pylint: disable=exec-used # pylint: disable=exec-used
exec(compile(file.read(), filepath, 'exec'), clientenv.namespace, None) exec(compile(file.read(), filepath, 'exec'), clientenv.namespace, None)
@@ -498,7 +515,7 @@ class Console(code.InteractiveConsole):
history = None history = None
if readline: if readline:
try: try:
history = expanduser(f'~/.config/frappy/{name}-history') history = Path(f'~/.local/state/frappy-{name}-history').expanduser()
readline.read_history_file(history) readline.read_history_file(history)
except FileNotFoundError: except FileNotFoundError:
pass pass
@@ -506,6 +523,7 @@ class Console(code.InteractiveConsole):
self.interact('', '') self.interact('', '')
finally: finally:
if history: if history:
history.parent.mkdir(mode=0o700, parents=True, exist_ok=True)
readline.write_history_file(history) readline.write_history_file(history)
def raw_input(self, prompt=""): def raw_input(self, prompt=""):

View File

@@ -16,13 +16,13 @@
# #
# Module authors: # Module authors:
# Alexander Zaft <a.zaft@fz-juelich.de> # Alexander Zaft <a.zaft@fz-juelich.de>
# Markus Zolliker <markus.zolliker@psi.ch>
# #
# ***************************************************************************** # *****************************************************************************
import os import os
from pathlib import Path from pathlib import Path
import re import re
from collections import Counter
from frappy.errors import ConfigError from frappy.errors import ConfigError
from frappy.lib import generalConfig from frappy.lib import generalConfig
@@ -88,17 +88,50 @@ class Mod(dict):
for member in members: for member in members:
self[member]['group'] = group self[member]['group'] = group
def override(self, **kwds):
name = self['name']
warnings = []
for key, ovr in kwds.items():
if isinstance(ovr, Group):
warnings.append(f'ignore Group when overriding module {name}')
continue
param = self.get(key)
if param is None:
self[key] = ovr if isinstance(ovr, Param) else Param(ovr)
continue
if isinstance(param, Param):
if isinstance(ovr, Param):
param.update(ovr)
else:
param['value'] = ovr
else: # description or cls
self[key] = ovr
return warnings
class Collector: class Collector:
def __init__(self, cls): def __init__(self):
self.list = [] self.modules = {}
self.cls = cls self.warnings = []
def add(self, *args, **kwds): def add(self, *args, **kwds):
self.list.append(self.cls(*args, **kwds)) mod = Mod(*args, **kwds)
name = mod.pop('name')
if name in self.modules:
self.warnings.append(f'duplicate module {name} overrides previous')
self.modules[name] = mod
return mod
def append(self, mod): def override(self, name, **kwds):
self.list.append(mod) """override properties/parameters of previously configured modules
this is useful together with 'include'
"""
mod = self.modules.get(name)
if mod is None:
self.warnings.append(f'try to override nonexisting module {name}')
return
self.warnings.extend(mod.override(**kwds))
class NodeCollector: class NodeCollector:
@@ -111,14 +144,16 @@ class NodeCollector:
else: else:
raise ConfigError('Only one Node is allowed per file!') raise ConfigError('Only one Node is allowed per file!')
def override(self, **kwds):
if self.node is None:
raise ConfigError('node must be defined before overriding')
self.node.update(kwds)
class Config(dict): class Config(dict):
def __init__(self, node, modules): def __init__(self, node, modules):
super().__init__( super().__init__(node=node.node, **modules.modules)
node=node.node, self.module_names = set(modules.modules)
**{mod['name']: mod for mod in modules.list}
)
self.module_names = {mod.pop('name') for mod in modules.list}
self.ambiguous = set() self.ambiguous = set()
def merge_modules(self, other): def merge_modules(self, other):
@@ -134,25 +169,35 @@ class Config(dict):
mod['original_id'] = equipment_id mod['original_id'] = equipment_id
class Include:
def __init__(self, namespace, log):
self.namespace = namespace
self.log = log
def __call__(self, cfgfile):
filename = to_config_path(cfgfile, self.log, '')
# pylint: disable=exec-used
exec(compile(filename.read_bytes(), filename, 'exec'), self.namespace)
def process_file(filename, log): def process_file(filename, log):
config_text = filename.read_bytes() config_text = filename.read_bytes()
node = NodeCollector() node = NodeCollector()
mods = Collector(Mod) mods = Collector()
ns = {'Node': node.add, 'Mod': mods.add, 'Param': Param, 'Command': Param, 'Group': Group} ns = {'Node': node.add, 'Mod': mods.add, 'Param': Param, 'Command': Param, 'Group': Group,
'override': mods.override, 'overrideNode': node.override}
ns['include'] = Include(ns, log)
# pylint: disable=exec-used # pylint: disable=exec-used
exec(compile(config_text, filename, 'exec'), ns) exec(compile(config_text, filename, 'exec'), ns)
# check for duplicates in the file itself. Between files comes later if mods.warnings:
duplicates = [name for name, count in Counter([mod['name'] log.warning('warnings in %s', filename)
for mod in mods.list]).items() if count > 1] for text in mods.warnings:
if duplicates: log.warning(text)
log.warning('Duplicate module name in file \'%s\': %s',
filename, ','.join(duplicates))
return Config(node, mods) return Config(node, mods)
def to_config_path(cfgfile, log): def to_config_path(cfgfile, log, check_end='_cfg.py'):
candidates = [cfgfile + e for e in ['_cfg.py', '.py', '']] candidates = [cfgfile + e for e in ['_cfg.py', '.py', '']]
if os.sep in cfgfile: # specified as full path if os.sep in cfgfile: # specified as full path
file = Path(cfgfile) if Path(cfgfile).exists() else None file = Path(cfgfile) if Path(cfgfile).exists() else None
@@ -166,8 +211,8 @@ def to_config_path(cfgfile, log):
file = None file = None
if file is None: if file is None:
raise ConfigError(f"Couldn't find cfg file {cfgfile!r} in {generalConfig.confdir}") raise ConfigError(f"Couldn't find cfg file {cfgfile!r} in {generalConfig.confdir}")
if not file.name.endswith('_cfg.py'): if not file.name.endswith(check_end):
log.warning("Config files should end in '_cfg.py': %s", file.name) log.warning("Config files should end in %r: %s", check_end, file.name)
log.debug('Using config file %s for %s', file, cfgfile) log.debug('Using config file %s for %s', file, cfgfile)
return file return file
@@ -195,6 +240,8 @@ def load_config(cfgfiles, log):
config.merge_modules(cfg) config.merge_modules(cfg)
else: else:
config = cfg config = cfg
if config.get('node') is None:
raise ConfigError(f'missing Node in {filename}')
if config.ambiguous: if config.ambiguous:
log.warning('ambiguous sections in %s: %r', log.warning('ambiguous sections in %s: %r',

View File

@@ -29,8 +29,8 @@ from frappy.datatypes import ArrayOf, BLOBType, BoolType, EnumType, \
FloatRange, IntRange, ScaledInteger, StringType, StructOf, TupleOf, StatusType FloatRange, IntRange, ScaledInteger, StringType, StructOf, TupleOf, StatusType
from frappy.lib.enum import Enum from frappy.lib.enum import Enum
from frappy.modulebase import Done, Module, Feature from frappy.modulebase import Done, Module, Feature
from frappy.modules import Attached, Communicator, \ from frappy.modules import Communicator, Drivable, Readable, Writable
Drivable, Readable, Writable from frappy.attached import Attached, AttachedDict
from frappy.params import Command, Parameter, Limit from frappy.params import Command, Parameter, Limit
from frappy.properties import Property from frappy.properties import Property
from frappy.proxy import Proxy, SecNode, proxy_class from frappy.proxy import Proxy, SecNode, proxy_class

214
frappy/ctrlby.py Normal file
View File

@@ -0,0 +1,214 @@
# *****************************************************************************
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Markus Zolliker <markus.zolliker@psi.ch>
#
# *****************************************************************************
from frappy.datatypes import BoolType, EnumType, Enum
from frappy.core import Parameter, Attached
class WrapControlledBy:
"""mixin to add controlled_by to writable modules
Create a wrapper class inheriting from this mixin
to add controlled_by to a Writable module
Usage:
class Enhanced(WrapControlledBy, BaseWritable):
pass
# typically nothing else has to be implemented
from a module with output (inheriting from HasOutput), the
method update_target must be called for internal updates
"""
controlled_by = Parameter('source of target value', EnumType(members={'self': 0}), default=0)
target = Parameter() # make sure target is a parameter
inputCallbacks = ()
def register_input(self, name, deactivate_control):
"""register input
:param name: the name of the module (for controlled_by enum)
:param deactivate_control: a method on the input module to switch off control
called by <controller module>.initModule
"""
if not self.inputCallbacks:
self.inputCallbacks = {}
self.inputCallbacks[name] = deactivate_control
prev_enum = self.parameters['controlled_by'].datatype.export_datatype()['members']
# add enum member, using autoincrement feature of Enum
self.parameters['controlled_by'].datatype = EnumType(Enum(prev_enum, **{name: None}))
self.log.info('enumtype %r', self.parameters['controlled_by'].datatype)
def write_controlled_by(self, modulename):
result = modulename
if modulename in ('self', self.name):
# inform the deactivate_control methods, that we have already switched
self.controlled_by = result = 'self'
for name, deactivate_control in self.inputCallbacks.items():
if name != modulename:
deactivate_control(modulename)
return result
def self_controlled(self):
"""method to change controlled_by to self
to be called from the write_target method
"""
if self.controlled_by != 0:
self.write_controlled_by('self')
def set_off(self):
"""to be overridden if the off state should be different from the default
on a FloatRange() the default value is 0
"""
zero = self.parameters['target'].datatype.default
try:
self.internal_set_target(zero)
except Exception as e:
self.target = zero
def update_target(self, module, value):
"""update internal target value
as write_target would switch to manual mode, the controlling module
has to use this method to update the value
override and super call, if other actions are needed
"""
if self.controlled_by != module:
deactivate_control = self.inputCallbacks.get(self.controlled_by)
if deactivate_control:
deactivate_control(module)
self.controlled_by = module
target = self.internal_set_target(value)
self.target = value if target is None else target
def write_target(self, target):
self.self_controlled()
return self.internal_set_target(target)
def internal_set_target(self, target):
# we need this additional indirection:
# super().write_target must refer to an inherited base class
# which is after WrapControlledBy in the method resolution order
return super().write_target(target)
class HasControlledBy(WrapControlledBy):
"""mixin for controlled_by functionality
Create a wrapper class inheriting from this mixin
to add controlled_by to a Writable module
Usage:
class Enhanced(HasControlledBy, BaseWritable):
def set_target(self, value):
# implement here hardware access for setting target
# do not override write_target!
from a module with output (inheriting from HasOutput), the
method update_target must be called for internal updates
"""
def set_target(self, value):
"""to be overridden for setting target of HW"""
raise NotImplementedError
def internal_set_target(self, value):
# we need this additional indirection:
# self.write_target must refer to a base class which
# is before HasControlledBy in the method resolution order
return self.set_target(value)
def set_off(self):
"""typically needs to be overridden"""
class HasOutputModule:
"""mixin for modules having an output module
this module will call the update_target method of an output module
"""
# mandatory=False: it should be possible to configure a module with fixed control
output_module = Attached(WrapControlledBy, mandatory=False)
control_active = Parameter('control mode', BoolType(), default=False)
target = Parameter() # make sure target is a parameter
def initModule(self):
super().initModule()
if self.output_module:
self.output_module.register_input(self.name, self.deactivate_control)
def write_control_active(self, value):
"""override with supercall if needed
control_active is readonly by default, as specified in the SECoP standard.
This method is meant to be called internally.
However, it is possible to override control_active with readonly=False
and this is quite useful IMHO in some situations
"""
out = self.output_module
if out:
if value:
if out.controlled_by != self.name:
# deactivate control an all modules controlling our output_module
out.write_controlled_by(self.name)
else:
if out.controlled_by == self.name:
out.set_off() # this sets out.controlled_by to 0 (=self)
def set_control_active(self, active):
"""to be overridden for switching hw control
TODO: remove this legacy method (replaced by write_control_active)
"""
self.control_active = active
def activate_control(self):
"""method to switch control_active on
TODO: remove this legacy method (replaced by write_control_active)
"""
self.write_control_active(True)
def deactivate_control(self, source=None):
"""called when another module takes over control
registered to be called from the controlled module(s)
"""
if self.control_active:
self.write_control_active(False)
self.log.warning(f'switched to manual mode by {source or self.name}')
def write_target(self, target):
self.write_control_active(True)
return self.set_target(target)
def set_target(self, target):
"""to be overridden"""
raise NotImplementedError

View File

@@ -53,13 +53,9 @@ def shortrepr(value):
return r return r
# base class for all DataTypes class SimpleDataType(HasProperties):
class DataType(HasProperties): """base class for simple datatypes, used in properties only"""
"""base class for all data types"""
IS_COMMAND = False
unit = ''
default = None default = None
client = False # used on the client side
def __call__(self, value): def __call__(self, value):
"""convert given value to our datatype and validate """convert given value to our datatype and validate
@@ -105,38 +101,10 @@ class DataType(HasProperties):
""" """
return self.format_value(value, False) return self.format_value(value, False)
def export_datatype(self):
"""return a python object which after jsonifying identifies this datatype"""
raise ProgrammingError(
f"{type(self).__name__} is not able to be exported to SECoP. "
f"It is intended for internal use only."
)
def export_value(self, value): def export_value(self, value):
"""if needed, reformat value for transport""" """if needed, reformat value for transport"""
return value return value
def import_value(self, value):
"""opposite of export_value, reformat from transport to internal repr
note: for importing from gui/configfile/commandline use :meth:`from_string`
instead.
"""
return self(value)
def format_value(self, value, unit=True):
"""format a value of this type into a string
This is intended for 'nice' formatting for humans and is NOT
the opposite of :meth:`from_string`
possible values of unit:
- True: use the string of the datatype
- False: return a value interpretable by ast.literal_eval (internal use only)
- any other string: use as unit (internal use only)
"""
raise NotImplementedError
def set_properties(self, **kwds): def set_properties(self, **kwds):
"""init datatype properties""" """init datatype properties"""
try: try:
@@ -161,6 +129,34 @@ class DataType(HasProperties):
# looks like the simplest way to make a deep copy # looks like the simplest way to make a deep copy
return get_datatype(self.export_datatype()) return get_datatype(self.export_datatype())
class DataType(SimpleDataType):
"""base class for data types used in parameters and commands"""
IS_COMMAND = False
unit = ''
client = False # used on the client side
def import_value(self, value):
"""opposite of export_value, reformat from transport to internal repr
note: for importing from gui/configfile/commandline use :meth:`from_string`
instead.
"""
return self(value)
def format_value(self, value, unit=True):
"""format a value of this type into a string
This is intended for 'nice' formatting for humans and is NOT
the opposite of :meth:`from_string`
possible values of unit:
- True: use the string of the datatype
- False: return a value interpretable by ast.literal_eval (internal use only)
- any other string: use as unit (internal use only)
"""
raise NotImplementedError
def compatible(self, other): def compatible(self, other):
"""check other for compatibility """check other for compatibility
@@ -169,6 +165,10 @@ class DataType(HasProperties):
""" """
raise NotImplementedError raise NotImplementedError
def export_datatype(self):
"""return a python object which after jsonifying identifies this datatype"""
raise NotImplementedError
def set_main_unit(self, unit): def set_main_unit(self, unit):
"""replace $ in unit by argument""" """replace $ in unit by argument"""
@@ -238,7 +238,7 @@ class FloatRange(HasUnit, DataType):
self.default = 0 if self.min <= 0 <= self.max else self.min self.default = 0 if self.min <= 0 <= self.max else self.min
super().checkProperties() super().checkProperties()
if '%' not in self.fmtstr: if '%' not in self.fmtstr:
raise ConfigError('Invalid fmtstr!') raise ConfigError('Invalid fmtstr')
def export_datatype(self): def export_datatype(self):
return self.get_info(type='double') return self.get_info(type='double')
@@ -411,7 +411,7 @@ class ScaledInteger(HasUnit, DataType):
# check values # check values
if '%' not in self.fmtstr: if '%' not in self.fmtstr:
raise ConfigError('Invalid fmtstr!') raise ConfigError('Invalid fmtstr')
# Remark: Datatype.copy() will round min, max to a multiple of self.scale # Remark: Datatype.copy() will round min, max to a multiple of self.scale
# this should be o.k. # this should be o.k.
@@ -557,9 +557,9 @@ class BLOBType(DataType):
internally treated as bytes internally treated as bytes
""" """
minbytes = Property('minimum number of bytes', IntRange(0), extname='minbytes', minbytes = Property('minimum number of bytes', IntRange(0, UNLIMITED), extname='minbytes',
default=0) default=0)
maxbytes = Property('maximum number of bytes', IntRange(0), extname='maxbytes', maxbytes = Property('maximum number of bytes', IntRange(0, UNLIMITED), extname='maxbytes',
mandatory=True) mandatory=True)
def __init__(self, minbytes=0, maxbytes=None): def __init__(self, minbytes=0, maxbytes=None):
@@ -587,10 +587,10 @@ class BLOBType(DataType):
size = len(value) size = len(value)
if size < self.minbytes: if size < self.minbytes:
raise RangeError( raise RangeError(
f'{value!r} must be at least {self.minbytes} bytes long!') f'blob {shortrepr(value)!r} must be at least {self.minbytes} bytes long (got {size})')
if size > self.maxbytes: if size > self.maxbytes:
raise RangeError( raise RangeError(
f'{value!r} must be at most {self.maxbytes} bytes long!') f'blob {shortrepr(value)!r} must be at most {self.maxbytes} bytes long (got {size})')
return value return value
def export_value(self, value): def export_value(self, value):
@@ -646,22 +646,22 @@ class StringType(DataType):
def __call__(self, value): def __call__(self, value):
"""accepts strings only""" """accepts strings only"""
if not isinstance(value, str): if not isinstance(value, str):
raise WrongTypeError(f'{shortrepr(value)} has the wrong type!') raise WrongTypeError(f'{shortrepr(value)} has the wrong type')
if not self.isUTF8: if not self.isUTF8:
try: try:
value.encode('ascii') value.encode('ascii')
except UnicodeEncodeError: except UnicodeEncodeError:
raise RangeError(f'{shortrepr(value)} contains non-ascii character!') from None raise RangeError(f'{shortrepr(value)} contains non-ascii character') from None
size = len(value) size = len(value)
if size < self.minchars: if size < self.minchars:
raise RangeError( raise RangeError(
f'{shortrepr(value)} must be at least {self.minchars} chars long!') f'string {shortrepr(value)} must be at least {self.minchars} chars long (got {size})')
if size > self.maxchars: if size > self.maxchars:
raise RangeError( raise RangeError(
f'{shortrepr(value)} must be at most {self.maxchars} chars long!') f'string {shortrepr(value)} must be at most {self.maxchars} chars long (got {size})')
if '\0' in value: if '\0' in value:
raise RangeError( raise RangeError(
'Strings are not allowed to embed a \\0! Use a Blob instead!') 'strings are not allowed to embed a null byte, Use a Blob instead')
return value return value
def export_value(self, value): def export_value(self, value):
@@ -724,12 +724,12 @@ class BoolType(DataType):
return False return False
if value in ['1', 'True', 'true', 'yes', 'on']: if value in ['1', 'True', 'true', 'yes', 'on']:
return True return True
raise WrongTypeError(f'{shortrepr(value)} is not a boolean value!') raise WrongTypeError(f'{shortrepr(value)} is not a boolean value')
def __call__(self, value): def __call__(self, value):
if value in (0, 1): if value in (0, 1):
return bool(value) return bool(value)
raise WrongTypeError(f'{shortrepr(value)} is not a boolean value!') raise WrongTypeError(f'{shortrepr(value)} is not a boolean value')
def export_value(self, value): def export_value(self, value):
"""returns a python object fit for serialisation""" """returns a python object fit for serialisation"""
@@ -755,16 +755,16 @@ class ArrayOf(DataType):
:param members: the datatype of the elements :param members: the datatype of the elements
""" """
minlen = Property('minimum number of elements', IntRange(0), extname='minlen', minlen = Property('minimum number of elements', IntRange(0, UNLIMITED), extname='minlen',
default=0) default=0)
maxlen = Property('maximum number of elements', IntRange(0), extname='maxlen', maxlen = Property('maximum number of elements', IntRange(0, UNLIMITED), extname='maxlen',
mandatory=True) mandatory=True)
def __init__(self, members, minlen=0, maxlen=None): def __init__(self, members, minlen=0, maxlen=None):
super().__init__() super().__init__()
if not isinstance(members, DataType): if not isinstance(members, DataType):
raise ProgrammingError( raise ProgrammingError(
'ArrayOf only works with a DataType as first argument!') 'ArrayOf only works with a DataType as first argument')
# one argument -> exactly that size # one argument -> exactly that size
# argument default to 100 # argument default to 100
if maxlen is None: if maxlen is None:
@@ -807,15 +807,16 @@ class ArrayOf(DataType):
def check_type(self, value): def check_type(self, value):
try: try:
size = len(value)
# check number of elements # check number of elements
if self.minlen is not None and len(value) < self.minlen: if self.minlen is not None and size < self.minlen:
raise RangeError( raise RangeError(
f'array too small, needs at least {self.minlen} elements!') f'array must have at least {self.minlen} elements (has {size})')
if self.maxlen is not None and len(value) > self.maxlen: if self.maxlen is not None and size > self.maxlen:
raise RangeError( raise RangeError(
f'array too big, holds at most {self.maxlen} elements!') f'array must have at most {self.maxlen} elements (has {size})')
except TypeError: except TypeError:
raise WrongTypeError(f'{type(value).__name__} can not be converted to ArrayOf DataType!') from None raise WrongTypeError(f'{type(value).__name__} can not be converted to ArrayOf DataType') from None
def __call__(self, value): def __call__(self, value):
"""accepts any sequence, converts to tuple (immutable!)""" """accepts any sequence, converts to tuple (immutable!)"""
@@ -881,11 +882,11 @@ class TupleOf(DataType):
def __init__(self, *members): def __init__(self, *members):
super().__init__() super().__init__()
if not members: if not members:
raise ProgrammingError('Empty tuples are not allowed!') raise ProgrammingError('Empty tuples are not allowed')
for subtype in members: for subtype in members:
if not isinstance(subtype, DataType): if not isinstance(subtype, DataType):
raise ProgrammingError( raise ProgrammingError(
'TupleOf only works with DataType objs as arguments!') 'TupleOf only works with DataType objs as arguments')
self.members = members self.members = members
self.default = tuple(el.default for el in members) self.default = tuple(el.default for el in members)
@@ -904,7 +905,7 @@ class TupleOf(DataType):
if len(value) == len(self.members): if len(value) == len(self.members):
return return
except TypeError: except TypeError:
raise WrongTypeError(f'{type(value).__name__} can not be converted to TupleOf DataType!') from None raise WrongTypeError(f'{type(value).__name__} can not be converted to TupleOf DataType') from None
raise WrongTypeError(f'tuple needs {len(self.members)} elements') raise WrongTypeError(f'tuple needs {len(self.members)} elements')
def __call__(self, value): def __call__(self, value):
@@ -969,16 +970,16 @@ class StructOf(DataType):
super().__init__() super().__init__()
self.members = members self.members = members
if not members: if not members:
raise ProgrammingError('Empty structs are not allowed!') raise ProgrammingError('Empty structs are not allowed')
self.optional = list(members if optional is None else optional) self.optional = list(members if optional is None else optional)
for name, subtype in list(members.items()): for name, subtype in list(members.items()):
if not isinstance(subtype, DataType): if not isinstance(subtype, DataType):
raise ProgrammingError( raise ProgrammingError(
'StructOf only works with named DataType objs as keyworded arguments!') 'StructOf only works with named DataType objs as keyworded arguments')
for name in self.optional: for name in self.optional:
if name not in members: if name not in members:
raise ProgrammingError( raise ProgrammingError(
'Only members of StructOf may be declared as optional!') 'Only members of StructOf may be declared as optional')
self.default = dict((k, el.default) for k, el in members.items()) self.default = dict((k, el.default) for k, el in members.items())
def copy(self): def copy(self):
@@ -1082,10 +1083,10 @@ class CommandType(DataType):
super().__init__() super().__init__()
if argument is not None: if argument is not None:
if not isinstance(argument, DataType): if not isinstance(argument, DataType):
raise ProgrammingError('CommandType: Argument type must be a DataType!') raise ProgrammingError('CommandType: Argument type must be a DataType')
if result is not None: if result is not None:
if not isinstance(result, DataType): if not isinstance(result, DataType):
raise ProgrammingError('CommandType: Result type must be a DataType!') raise ProgrammingError('CommandType: Result type must be a DataType')
self.argument = argument self.argument = argument
self.result = result self.result = result
@@ -1107,10 +1108,10 @@ class CommandType(DataType):
raise ProgrammingError('commands can not be converted to a value') raise ProgrammingError('commands can not be converted to a value')
def export_value(self, value): def export_value(self, value):
raise ProgrammingError('values of type command can not be transported!') raise ProgrammingError('values of type command can not be transported')
def import_value(self, value): def import_value(self, value):
raise ProgrammingError('values of type command can not be transported!') raise ProgrammingError('values of type command can not be transported')
def from_string(self, text): def from_string(self, text):
raise ProgrammingError('a string can not be converted to a command') raise ProgrammingError('a string can not be converted to a command')
@@ -1131,10 +1132,23 @@ class CommandType(DataType):
# internally used datatypes (i.e. only for programming the SEC-node) # internally used datatypes (i.e. only for programming the SEC-node)
class DataTypeType(DataType): class DefaultType(DataType):
"""datatype used as default for parameters
needs some minimal interface to avoid errors when
the datatype of a parameter is not yet defined
"""
def __call__(self, value):
return value
def setProperty(self, key, value):
"""silently ignored"""
class DataTypeType(SimpleDataType):
def __call__(self, value): def __call__(self, value):
"""accepts a datatype""" """accepts a datatype"""
if isinstance(value, DataType): if isinstance(value, SimpleDataType):
return value return value
#TODO: not needed anymore? #TODO: not needed anymore?
try: try:
@@ -1155,7 +1169,7 @@ class DataTypeType(DataType):
raise NotImplementedError raise NotImplementedError
class ValueType(DataType): class ValueType(SimpleDataType):
"""Can take any python value. """Can take any python value.
The optional (callable) validator can be used to restrict values to a The optional (callable) validator can be used to restrict values to a
@@ -1178,7 +1192,7 @@ class ValueType(DataType):
try: try:
return self.validator(value) return self.validator(value)
except Exception as e: except Exception as e:
raise ConfigError(f'Validator {self.validator} raised {e!r} for value {value}') from e raise ConfigError(f'Validator {self.validator} raised {e!r} for value {shortrepr(value)}') from e
return value return value
def copy(self): def copy(self):
@@ -1188,23 +1202,8 @@ class ValueType(DataType):
"""if needed, reformat value for transport""" """if needed, reformat value for transport"""
return value return value
def import_value(self, value):
"""opposite of export_value, reformat from transport to internal repr
note: for importing from gui/configfile/commandline use :meth:`from_string` class NoneOr(SimpleDataType):
instead.
"""
raise NotImplementedError
def setProperty(self, key, value):
"""silently ignored
as ValueType is used for the datatype default, this makes code
shorter for cases, where the datatype may not yet be defined
"""
class NoneOr(DataType):
"""validates a None or smth. else""" """validates a None or smth. else"""
default = None default = None
@@ -1222,7 +1221,7 @@ class NoneOr(DataType):
return self.other.export_value(value) return self.other.export_value(value)
class OrType(DataType): class OrType(SimpleDataType):
def __init__(self, *types): def __init__(self, *types):
super().__init__() super().__init__()
self.types = types self.types = types

Some files were not shown because too many files have changed in this diff Show More