cgse 2024.7.0__py3-none-any.whl → 2025.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- README.md +27 -0
- bump.py +85 -0
- cgse-2025.0.2.dist-info/METADATA +38 -0
- cgse-2025.0.2.dist-info/RECORD +5 -0
- {cgse-2024.7.0.dist-info → cgse-2025.0.2.dist-info}/WHEEL +1 -2
- cgse-2024.7.0.dist-info/COPYING +0 -674
- cgse-2024.7.0.dist-info/COPYING.LESSER +0 -165
- cgse-2024.7.0.dist-info/METADATA +0 -144
- cgse-2024.7.0.dist-info/RECORD +0 -660
- cgse-2024.7.0.dist-info/entry_points.txt +0 -75
- cgse-2024.7.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5238
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -627
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -903
- egse/aeu/aeu_metrics.py +0 -131
- egse/aeu/aeu_protocol.py +0 -463
- egse/aeu/aeu_psu.yaml +0 -204
- egse/aeu/aeu_ui.py +0 -873
- egse/aeu/arbdata/FccdRead.arb +0 -2
- egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
- egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/ccdRead25.arb +0 -2
- egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead50.arb +0 -2
- egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
- egse/alert/__init__.py +0 -1049
- egse/alert/alertman.yaml +0 -37
- egse/alert/alertman_cs.py +0 -233
- egse/alert/alertman_ui.py +0 -600
- egse/alert/gsm/beaglebone.py +0 -138
- egse/alert/gsm/beaglebone.yaml +0 -51
- egse/alert/gsm/beaglebone_cs.py +0 -108
- egse/alert/gsm/beaglebone_devif.py +0 -122
- egse/alert/gsm/beaglebone_protocol.py +0 -46
- egse/bits.py +0 -318
- egse/camera.py +0 -44
- egse/collimator/__init__.py +0 -0
- egse/collimator/fcul/__init__.py +0 -0
- egse/collimator/fcul/ogse.py +0 -1077
- egse/collimator/fcul/ogse.yaml +0 -14
- egse/collimator/fcul/ogse_cs.py +0 -154
- egse/collimator/fcul/ogse_devif.py +0 -358
- egse/collimator/fcul/ogse_protocol.py +0 -132
- egse/collimator/fcul/ogse_sim.py +0 -431
- egse/collimator/fcul/ogse_ui.py +0 -1108
- egse/command.py +0 -699
- egse/config.py +0 -410
- egse/confman/__init__.py +0 -1058
- egse/confman/confman.yaml +0 -70
- egse/confman/confman_cs.py +0 -240
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -632
- egse/coordinates/__init__.py +0 -534
- egse/coordinates/avoidance.py +0 -100
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -122
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -194
- egse/coordinates/referenceFrame.py +0 -1279
- egse/coordinates/refmodel.py +0 -737
- egse/coordinates/rotationMatrix.py +0 -85
- egse/coordinates/transform3d_addon.py +0 -419
- egse/csl/__init__.py +0 -50
- egse/csl/commanding.py +0 -78
- egse/csl/icons/hexapod-connected-selected.svg +0 -30
- egse/csl/icons/hexapod-connected.svg +0 -30
- egse/csl/icons/hexapod-homing-selected.svg +0 -68
- egse/csl/icons/hexapod-homing.svg +0 -68
- egse/csl/icons/hexapod-retract-selected.svg +0 -56
- egse/csl/icons/hexapod-retract.svg +0 -51
- egse/csl/icons/hexapod-zero-selected.svg +0 -56
- egse/csl/icons/hexapod-zero.svg +0 -56
- egse/csl/icons/logo-puna.svg +0 -92
- egse/csl/icons/stop.svg +0 -1
- egse/csl/initialisation.py +0 -102
- egse/csl/mech_pos_settings.yaml +0 -18
- egse/das.py +0 -1240
- egse/das.yaml +0 -7
- egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
- egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
- egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
- egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
- egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
- egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
- egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
- egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
- egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
- egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
- egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
- egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
- egse/decorators.py +0 -514
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2698
- egse/dpu/ccd_ui.py +0 -514
- egse/dpu/dpu.py +0 -783
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -671
- egse/dpu/fitsgen.py +0 -2096
- egse/dpu/fitsgen_ui.py +0 -399
- egse/dpu/hdf5_model.py +0 -332
- egse/dpu/hdf5_ui.py +0 -277
- egse/dpu/hdf5_viewer.py +0 -506
- egse/dpu/hk_ui.py +0 -468
- egse/dpu_commands.py +0 -81
- egse/dsi/__init__.py +0 -33
- egse/dsi/_libesl.py +0 -232
- egse/dsi/constants.py +0 -296
- egse/dsi/esl.py +0 -630
- egse/dsi/rmap.py +0 -444
- egse/dsi/rmapci.py +0 -39
- egse/dsi/spw.py +0 -335
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -318
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -26
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -37
- egse/fdir/fdir_manager_controller.py +0 -136
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -15
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -30
- egse/fdir/fdir_remote_controller.py +0 -30
- egse/fdir/fdir_remote_cs.py +0 -94
- egse/fdir/fdir_remote_interface.py +0 -9
- egse/fdir/fdir_remote_popup.py +0 -26
- egse/fee/__init__.py +0 -106
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/feesim.py +0 -914
- egse/fee/n_fee_hk.py +0 -768
- egse/fee/nfee.py +0 -188
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -49
- egse/filterwheel/eksma/fw8smc4.py +0 -657
- egse/filterwheel/eksma/fw8smc4.yaml +0 -121
- egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
- egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
- egse/filterwheel/eksma/fw8smc4_protocol.py +0 -82
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -115
- egse/filterwheel/eksma/fw8smc5.yaml +0 -105
- egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
- egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
- egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
- egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
- egse/filterwheel/eksma/fw8smc5_ui.py +0 -1065
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -710
- egse/fov/fov_ui.py +0 -859
- egse/fov/fov_ui_controller.py +0 -140
- egse/fov/fov_ui_model.py +0 -200
- egse/fov/fov_ui_view.py +0 -345
- egse/gimbal/__init__.py +0 -32
- egse/gimbal/symetrie/__init__.py +0 -26
- egse/gimbal/symetrie/alpha.py +0 -586
- egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
- egse/gimbal/symetrie/gimbal.py +0 -877
- egse/gimbal/symetrie/gimbal.yaml +0 -168
- egse/gimbal/symetrie/gimbal_cs.py +0 -183
- egse/gimbal/symetrie/gimbal_protocol.py +0 -138
- egse/gimbal/symetrie/gimbal_ui.py +0 -361
- egse/gimbal/symetrie/pmac.py +0 -1006
- egse/gimbal/symetrie/pmac_regex.py +0 -83
- egse/graph.py +0 -132
- egse/gui/__init__.py +0 -47
- egse/gui/buttons.py +0 -378
- egse/gui/focalplane.py +0 -1285
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -587
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- egse/gui/styles.qss +0 -48
- egse/gui/switch.py +0 -112
- egse/h5.py +0 -274
- egse/help/__init__.py +0 -0
- egse/help/help_ui.py +0 -126
- egse/hexapod/__init__.py +0 -32
- egse/hexapod/symetrie/__init__.py +0 -137
- egse/hexapod/symetrie/alpha.py +0 -874
- egse/hexapod/symetrie/dynalpha.py +0 -1387
- egse/hexapod/symetrie/hexapod_ui.py +0 -1516
- egse/hexapod/symetrie/pmac.py +0 -1010
- egse/hexapod/symetrie/pmac_regex.py +0 -83
- egse/hexapod/symetrie/puna.py +0 -1167
- egse/hexapod/symetrie/puna.yaml +0 -193
- egse/hexapod/symetrie/puna_cs.py +0 -195
- egse/hexapod/symetrie/puna_protocol.py +0 -134
- egse/hexapod/symetrie/puna_ui.py +0 -433
- egse/hexapod/symetrie/punaplus.py +0 -107
- egse/hexapod/symetrie/zonda.py +0 -872
- egse/hexapod/symetrie/zonda.yaml +0 -337
- egse/hexapod/symetrie/zonda_cs.py +0 -172
- egse/hexapod/symetrie/zonda_devif.py +0 -414
- egse/hexapod/symetrie/zonda_protocol.py +0 -123
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -791
- egse/icons/aeu-cs-start.svg +0 -117
- egse/icons/aeu-cs-stop.svg +0 -118
- egse/icons/aeu-cs.svg +0 -107
- egse/icons/aeu_cs-started.svg +0 -112
- egse/icons/aeu_cs-stopped.svg +0 -112
- egse/icons/aeu_cs.svg +0 -55
- egse/icons/alert.svg +0 -1
- egse/icons/arrow-double-left.png +0 -0
- egse/icons/arrow-double-right.png +0 -0
- egse/icons/arrow-up.svg +0 -11
- egse/icons/backward.svg +0 -1
- egse/icons/busy.svg +0 -1
- egse/icons/cleaning.svg +0 -115
- egse/icons/color-scheme.svg +0 -1
- egse/icons/cs-connected-alert.svg +0 -91
- egse/icons/cs-connected-disabled.svg +0 -43
- egse/icons/cs-connected.svg +0 -89
- egse/icons/cs-not-connected.svg +0 -44
- egse/icons/double-left-arrow.svg +0 -1
- egse/icons/double-right-arrow.svg +0 -1
- egse/icons/erase-disabled.svg +0 -19
- egse/icons/erase.svg +0 -59
- egse/icons/fitsgen-start.svg +0 -47
- egse/icons/fitsgen-stop.svg +0 -48
- egse/icons/fitsgen.svg +0 -1
- egse/icons/forward.svg +0 -1
- egse/icons/fov-hk-start.svg +0 -33
- egse/icons/fov-hk-stop.svg +0 -37
- egse/icons/fov-hk.svg +0 -1
- egse/icons/front-desk.svg +0 -1
- egse/icons/home-actioned.svg +0 -15
- egse/icons/home-disabled.svg +0 -15
- egse/icons/home.svg +0 -13
- egse/icons/info.svg +0 -1
- egse/icons/invalid.png +0 -0
- egse/icons/led-green.svg +0 -20
- egse/icons/led-grey.svg +0 -20
- egse/icons/led-orange.svg +0 -20
- egse/icons/led-red.svg +0 -20
- egse/icons/led-square-green.svg +0 -134
- egse/icons/led-square-grey.svg +0 -134
- egse/icons/led-square-orange.svg +0 -134
- egse/icons/led-square-red.svg +0 -134
- egse/icons/limit-switch-all-green.svg +0 -115
- egse/icons/limit-switch-all-red.svg +0 -117
- egse/icons/limit-switch-el+.svg +0 -116
- egse/icons/limit-switch-el-.svg +0 -117
- egse/icons/location-marker.svg +0 -1
- egse/icons/logo-dpu.svg +0 -48
- egse/icons/logo-gimbal.svg +0 -112
- egse/icons/logo-huber.svg +0 -23
- egse/icons/logo-ogse.svg +0 -31
- egse/icons/logo-puna.svg +0 -92
- egse/icons/logo-tcs.svg +0 -29
- egse/icons/logo-zonda.svg +0 -66
- egse/icons/maximize.svg +0 -1
- egse/icons/meter.svg +0 -1
- egse/icons/more.svg +0 -45
- egse/icons/n-fee-hk-start.svg +0 -24
- egse/icons/n-fee-hk-stop.svg +0 -25
- egse/icons/n-fee-hk.svg +0 -83
- egse/icons/observing-off.svg +0 -46
- egse/icons/observing-on.svg +0 -46
- egse/icons/open-document-hdf5.png +0 -0
- egse/icons/open-document-hdf5.svg +0 -21
- egse/icons/ops-mode.svg +0 -1
- egse/icons/play-green.svg +0 -17
- egse/icons/plugged-disabled.svg +0 -27
- egse/icons/plugged.svg +0 -21
- egse/icons/pm_ui.svg +0 -1
- egse/icons/power-button-green.svg +0 -27
- egse/icons/power-button-red.svg +0 -27
- egse/icons/power-button.svg +0 -27
- egse/icons/radar.svg +0 -1
- egse/icons/radioactive.svg +0 -2
- egse/icons/reload.svg +0 -1
- egse/icons/remote-control-off.svg +0 -28
- egse/icons/remote-control-on.svg +0 -28
- egse/icons/repeat-blue.svg +0 -15
- egse/icons/repeat.svg +0 -1
- egse/icons/settings.svg +0 -1
- egse/icons/shrink.svg +0 -1
- egse/icons/shutter.svg +0 -1
- egse/icons/sign-off.svg +0 -1
- egse/icons/sign-on.svg +0 -1
- egse/icons/sim-mode.svg +0 -1
- egse/icons/small-buttons-go.svg +0 -20
- egse/icons/small-buttons-minus.svg +0 -51
- egse/icons/small-buttons-plus.svg +0 -51
- egse/icons/sponge.svg +0 -220
- egse/icons/start-button-disabled.svg +0 -84
- egse/icons/start-button.svg +0 -50
- egse/icons/stop-button-disabled.svg +0 -84
- egse/icons/stop-button.svg +0 -50
- egse/icons/stop-red.svg +0 -17
- egse/icons/stop.svg +0 -1
- egse/icons/switch-disabled-square.svg +0 -87
- egse/icons/switch-disabled.svg +0 -15
- egse/icons/switch-off-square.svg +0 -87
- egse/icons/switch-off.svg +0 -72
- egse/icons/switch-on-square.svg +0 -87
- egse/icons/switch-on.svg +0 -61
- egse/icons/temperature-control.svg +0 -44
- egse/icons/th_ui_logo.svg +0 -1
- egse/icons/unplugged.svg +0 -23
- egse/icons/unvalid.png +0 -0
- egse/icons/user-interface.svg +0 -1
- egse/icons/vacuum.svg +0 -1
- egse/icons/valid.png +0 -0
- egse/icons/zoom-to-pixel-dark.svg +0 -64
- egse/icons/zoom-to-pixel-white.svg +0 -36
- egse/images/big-rotation-stage.png +0 -0
- egse/images/connected-100.png +0 -0
- egse/images/cross.svg +0 -6
- egse/images/disconnected-100.png +0 -0
- egse/images/gui-icon.png +0 -0
- egse/images/home.svg +0 -6
- egse/images/info-icon.png +0 -0
- egse/images/led-black.svg +0 -89
- egse/images/led-green.svg +0 -85
- egse/images/led-orange.svg +0 -85
- egse/images/led-red.svg +0 -85
- egse/images/load-icon.png +0 -0
- egse/images/load-setup.png +0 -0
- egse/images/load.png +0 -0
- egse/images/pause.png +0 -0
- egse/images/play-button.svg +0 -8
- egse/images/play.png +0 -0
- egse/images/process-status.png +0 -0
- egse/images/restart.png +0 -0
- egse/images/search.png +0 -0
- egse/images/sma.png +0 -0
- egse/images/start.png +0 -0
- egse/images/stop-button.svg +0 -8
- egse/images/stop.png +0 -0
- egse/images/switch-off.svg +0 -48
- egse/images/switch-on.svg +0 -48
- egse/images/undo.png +0 -0
- egse/images/update-button.svg +0 -11
- egse/imageviewer/exposureselection.py +0 -475
- egse/imageviewer/imageviewer.py +0 -198
- egse/imageviewer/matchfocalplane.py +0 -179
- egse/imageviewer/subfieldposition.py +0 -133
- egse/lampcontrol/__init__.py +0 -4
- egse/lampcontrol/beaglebone/beaglebone.py +0 -178
- egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
- egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
- egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
- egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
- egse/lampcontrol/energetiq/__init__.py +0 -22
- egse/lampcontrol/energetiq/eq99.yaml +0 -98
- egse/lampcontrol/energetiq/lampEQ99.py +0 -283
- egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
- egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
- egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
- egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -71
- egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
- egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
- egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
- egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
- egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
- egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
- egse/lib/ximc/libximc.framework/libbindy.so +0 -0
- egse/lib/ximc/libximc.framework/libximc +0 -0
- egse/lib/ximc/libximc.framework/libximc.so +0 -0
- egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
- egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
- egse/lib/ximc/pyximc.py +0 -922
- egse/listener.py +0 -179
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -102
- egse/mixin.py +0 -464
- egse/monitoring.py +0 -95
- egse/ni/alarms/__init__.py +0 -26
- egse/ni/alarms/cdaq9375.py +0 -300
- egse/ni/alarms/cdaq9375.yaml +0 -89
- egse/ni/alarms/cdaq9375_cs.py +0 -130
- egse/ni/alarms/cdaq9375_devif.py +0 -183
- egse/ni/alarms/cdaq9375_protocol.py +0 -48
- egse/obs_inspection.py +0 -165
- egse/observer.py +0 -41
- egse/obsid.py +0 -163
- egse/powermeter/__init__.py +0 -0
- egse/powermeter/ni/__init__.py +0 -38
- egse/powermeter/ni/cdaq9184.py +0 -224
- egse/powermeter/ni/cdaq9184.yaml +0 -73
- egse/powermeter/ni/cdaq9184_cs.py +0 -130
- egse/powermeter/ni/cdaq9184_devif.py +0 -201
- egse/powermeter/ni/cdaq9184_protocol.py +0 -48
- egse/powermeter/ni/cdaq9184_ui.py +0 -544
- egse/powermeter/thorlabs/__init__.py +0 -25
- egse/powermeter/thorlabs/pm100a.py +0 -380
- egse/powermeter/thorlabs/pm100a.yaml +0 -132
- egse/powermeter/thorlabs/pm100a_cs.py +0 -136
- egse/powermeter/thorlabs/pm100a_devif.py +0 -127
- egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
- egse/powermeter/thorlabs/pm100a_ui.py +0 -725
- egse/process.py +0 -451
- egse/procman/__init__.py +0 -834
- egse/procman/cannot_start_process_popup.py +0 -43
- egse/procman/procman.yaml +0 -49
- egse/procman/procman_cs.py +0 -201
- egse/procman/procman_ui.py +0 -2081
- egse/protocol.py +0 -605
- egse/proxy.py +0 -531
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -693
- egse/resource.py +0 -333
- egse/rmap.py +0 -406
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -247
- egse/services.yaml +0 -68
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1181
- egse/shutter/__init__.py +0 -0
- egse/shutter/thorlabs/__init__.py +0 -19
- egse/shutter/thorlabs/ksc101.py +0 -205
- egse/shutter/thorlabs/ksc101.yaml +0 -105
- egse/shutter/thorlabs/ksc101_cs.py +0 -136
- egse/shutter/thorlabs/ksc101_devif.py +0 -201
- egse/shutter/thorlabs/ksc101_protocol.py +0 -71
- egse/shutter/thorlabs/ksc101_ui.py +0 -548
- egse/shutter/thorlabs/sc10.py +0 -82
- egse/shutter/thorlabs/sc10.yaml +0 -52
- egse/shutter/thorlabs/sc10_controller.py +0 -81
- egse/shutter/thorlabs/sc10_cs.py +0 -108
- egse/shutter/thorlabs/sc10_interface.py +0 -25
- egse/shutter/thorlabs/sc10_simulator.py +0 -30
- egse/simulator.py +0 -41
- egse/slack.py +0 -61
- egse/socketdevice.py +0 -218
- egse/sockets.py +0 -218
- egse/spw.py +0 -1401
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -245
- egse/stages/aerotech/ensemble.yaml +0 -205
- egse/stages/aerotech/ensemble_controller.py +0 -275
- egse/stages/aerotech/ensemble_cs.py +0 -110
- egse/stages/aerotech/ensemble_interface.py +0 -132
- egse/stages/aerotech/ensemble_parameters.py +0 -433
- egse/stages/aerotech/ensemble_simulator.py +0 -27
- egse/stages/aerotech/mgse_sim.py +0 -188
- egse/stages/arun/smd3.py +0 -110
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -470
- egse/stages/arun/smd3_cs.py +0 -112
- egse/stages/arun/smd3_interface.py +0 -53
- egse/stages/arun/smd3_simulator.py +0 -27
- egse/stages/arun/smd3_stop.py +0 -16
- egse/stages/huber/__init__.py +0 -49
- egse/stages/huber/smc9300.py +0 -920
- egse/stages/huber/smc9300.yaml +0 -63
- egse/stages/huber/smc9300_cs.py +0 -178
- egse/stages/huber/smc9300_devif.py +0 -345
- egse/stages/huber/smc9300_protocol.py +0 -113
- egse/stages/huber/smc9300_sim.py +0 -547
- egse/stages/huber/smc9300_ui.py +0 -973
- egse/state.py +0 -173
- egse/statemachine.py +0 -274
- egse/storage/__init__.py +0 -1067
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -79
- egse/storage/storage_cs.py +0 -231
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -417
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1611
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -879
- egse/tcs/tcs.yaml +0 -14
- egse/tcs/tcs_cs.py +0 -202
- egse/tcs/tcs_devif.py +0 -292
- egse/tcs/tcs_protocol.py +0 -180
- egse/tcs/tcs_sim.py +0 -177
- egse/tcs/tcs_ui.py +0 -543
- egse/tdms.py +0 -171
- egse/tempcontrol/__init__.py +0 -23
- egse/tempcontrol/agilent/agilent34970.py +0 -109
- egse/tempcontrol/agilent/agilent34970.yaml +0 -44
- egse/tempcontrol/agilent/agilent34970_cs.py +0 -114
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -96
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -115
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -98
- egse/tempcontrol/beaglebone/beaglebone.py +0 -341
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -134
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -674
- egse/tempcontrol/digalox/digalox.py +0 -115
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -108
- egse/tempcontrol/digalox/digalox_protocol.py +0 -56
- egse/tempcontrol/keithley/__init__.py +0 -33
- egse/tempcontrol/keithley/daq6510.py +0 -662
- egse/tempcontrol/keithley/daq6510.yaml +0 -105
- egse/tempcontrol/keithley/daq6510_cs.py +0 -163
- egse/tempcontrol/keithley/daq6510_devif.py +0 -343
- egse/tempcontrol/keithley/daq6510_protocol.py +0 -79
- egse/tempcontrol/keithley/daq6510_sim.py +0 -186
- egse/tempcontrol/lakeshore/__init__.py +0 -33
- egse/tempcontrol/lakeshore/lsci.py +0 -361
- egse/tempcontrol/lakeshore/lsci.yaml +0 -162
- egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
- egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
- egse/tempcontrol/lakeshore/lsci_protocol.py +0 -76
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -387
- egse/tempcontrol/ni/__init__.py +0 -0
- egse/tempcontrol/spid/spid.py +0 -109
- egse/tempcontrol/spid/spid.yaml +0 -81
- egse/tempcontrol/spid/spid_controller.py +0 -279
- egse/tempcontrol/spid/spid_cs.py +0 -136
- egse/tempcontrol/spid/spid_protocol.py +0 -107
- egse/tempcontrol/spid/spid_ui.py +0 -723
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -867
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -116
- egse/tempcontrol/srs/ptc10_protocol.py +0 -39
- egse/tempcontrol/srs/ptc10_ui.py +0 -906
- egse/ups/apc/apc.py +0 -236
- egse/ups/apc/apc.yaml +0 -45
- egse/ups/apc/apc_cs.py +0 -101
- egse/ups/apc/apc_protocol.py +0 -125
- egse/user.yaml +0 -7
- egse/vacuum/beaglebone/beaglebone.py +0 -149
- egse/vacuum/beaglebone/beaglebone.yaml +0 -44
- egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
- egse/vacuum/beaglebone/beaglebone_devif.py +0 -159
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -192
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -91
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -124
- egse/vacuum/instrutech/igm402_cs.py +0 -108
- egse/vacuum/instrutech/igm402_interface.py +0 -49
- egse/vacuum/instrutech/igm402_simulator.py +0 -36
- egse/vacuum/keller/kellerBus.py +0 -256
- egse/vacuum/keller/leo3.py +0 -100
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -81
- egse/vacuum/keller/leo3_cs.py +0 -101
- egse/vacuum/keller/leo3_interface.py +0 -33
- egse/vacuum/mks/evision.py +0 -86
- egse/vacuum/mks/evision.yaml +0 -75
- egse/vacuum/mks/evision_cs.py +0 -101
- egse/vacuum/mks/evision_devif.py +0 -313
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -701
- egse/vacuum/pfeiffer/acp40.py +0 -87
- egse/vacuum/pfeiffer/acp40.yaml +0 -60
- egse/vacuum/pfeiffer/acp40_controller.py +0 -117
- egse/vacuum/pfeiffer/acp40_cs.py +0 -109
- egse/vacuum/pfeiffer/acp40_interface.py +0 -40
- egse/vacuum/pfeiffer/acp40_simulator.py +0 -37
- egse/vacuum/pfeiffer/tc400.py +0 -87
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -136
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -35
- egse/vacuum/pfeiffer/tpg261.py +0 -80
- egse/vacuum/pfeiffer/tpg261.yaml +0 -66
- egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
- egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
- egse/vacuum/pfeiffer/tpg261_interface.py +0 -59
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -23
- egse/version.py +0 -174
- egse/visitedpositions.py +0 -398
- egse/windowing.py +0 -213
- egse/zmq/__init__.py +0 -28
- egse/zmq/spw.py +0 -160
- egse/zmq_ser.py +0 -41
- scripts/alerts/cold.yaml +0 -278
- scripts/alerts/example_alerts.yaml +0 -54
- scripts/alerts/transition.yaml +0 -14
- scripts/alerts/warm.yaml +0 -49
- scripts/analyse_n_fee_hk_data.py +0 -52
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/check_tcs_calib_coef.py +0 -90
- scripts/correct_ccd_cold_temperature_cal.py +0 -157
- scripts/create_hdf5_report.py +0 -293
- scripts/csl_model.py +0 -420
- scripts/csl_restore_setup.py +0 -229
- scripts/export-grafana-dashboards.py +0 -49
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -54
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -10
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -61
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -59
- scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
- scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
- scripts/fix_csv.py +0 -80
- scripts/ias/correct_ccd_temp_cal_elfique.py +0 -43
- scripts/ias/correct_ccd_temp_cal_floreffe.py +0 -43
- scripts/ias/correct_trp_swap_achel.py +0 -199
- scripts/inta/correct_ccd_temp_cal_duvel.py +0 -43
- scripts/inta/correct_ccd_temp_cal_gueuze.py +0 -43
- scripts/n_fee_supply_voltage_calculation.py +0 -92
- scripts/playground.py +0 -30
- scripts/print_hdf5_hk_data.py +0 -68
- scripts/print_register_map.py +0 -43
- scripts/remove_lines_between_matches.py +0 -188
- scripts/sron/commanding/control_heaters.py +0 -44
- scripts/sron/commanding/pumpdown.py +0 -46
- scripts/sron/commanding/set_pid_setpoint.py +0 -19
- scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
- scripts/sron/commanding/shutdown_pumps.py +0 -33
- scripts/sron/correct_mgse_coordinates_brigand_chimay.py +0 -272
- scripts/sron/correct_trp_swap_brigand.py +0 -204
- scripts/sron/gimbal_conversions.py +0 -75
- scripts/sron/tm_gen/tm_gen_agilent.py +0 -37
- scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
- scripts/sron/tm_gen/tm_gen_spid.py +0 -13
- scripts/update_operational_cgse.py +0 -268
- scripts/update_operational_cgse_old.py +0 -273
egse/mixin.py
DELETED
|
@@ -1,464 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module defines Mixin classes that can be used for adding methods and properties to
|
|
3
|
-
classes without strict inheritance.
|
|
4
|
-
|
|
5
|
-
Be careful, some of the Mixin classes require certain attributes to be defined in the
|
|
6
|
-
outer sub-class. Read the docstrings carefully to understand what is needed.
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import contextlib
|
|
10
|
-
import enum
|
|
11
|
-
import functools
|
|
12
|
-
import inspect
|
|
13
|
-
import logging
|
|
14
|
-
import string
|
|
15
|
-
from typing import Callable
|
|
16
|
-
from typing import Dict
|
|
17
|
-
|
|
18
|
-
from egse.command import ClientServerCommand
|
|
19
|
-
from egse.command import CommandError
|
|
20
|
-
from egse.command import CommandExecution
|
|
21
|
-
from egse.protocol import DynamicCommandProtocol
|
|
22
|
-
from egse.protocol import get_function
|
|
23
|
-
|
|
24
|
-
LOGGER = logging.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
__all__ = [
|
|
27
|
-
"add_lf",
|
|
28
|
-
"add_cr_lf",
|
|
29
|
-
"dynamic_command",
|
|
30
|
-
"DynamicCommandMixin",
|
|
31
|
-
]
|
|
32
|
-
|
|
33
|
-
# ----- Mixin for dynamic commanding ---------------------------------------------------------------
|
|
34
|
-
|
|
35
|
-
COMMAND_TYPES = {
|
|
36
|
-
"read": "__read_command",
|
|
37
|
-
"write": "__write_command",
|
|
38
|
-
"query": "__query_command",
|
|
39
|
-
"transaction": "__transaction_command",
|
|
40
|
-
}
|
|
41
|
-
STX = "\x02" # start-of-text
|
|
42
|
-
ETX = "\x03" # end-of-text
|
|
43
|
-
EOT = "\x04" # end-of-transmission
|
|
44
|
-
LINE_FEED = "\x0A"
|
|
45
|
-
CARRIAGE_RETURN = "\x0D"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def add_etx(cmd_string: str):
|
|
49
|
-
"""
|
|
50
|
-
Add an end-of-text ETX (ASCII code 0x03) to the command string.
|
|
51
|
-
|
|
52
|
-
Args:
|
|
53
|
-
cmd_string: the unprocessed command string
|
|
54
|
-
|
|
55
|
-
Returns:
|
|
56
|
-
The command string with the ETX character appended.
|
|
57
|
-
"""
|
|
58
|
-
return cmd_string if cmd_string.endswith(ETX) else cmd_string + ETX
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def add_eot(cmd_string: str):
|
|
62
|
-
"""
|
|
63
|
-
Add an end-of-transmission EOT (ASCII code 0x04) to the command string.
|
|
64
|
-
|
|
65
|
-
Args:
|
|
66
|
-
cmd_string: the unprocessed command string
|
|
67
|
-
|
|
68
|
-
Returns:
|
|
69
|
-
The command string with the EOT character appended.
|
|
70
|
-
"""
|
|
71
|
-
return cmd_string if cmd_string.endswith(EOT) else cmd_string + EOT
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def add_lf(cmd_string: str):
|
|
75
|
-
""" Add a line feed to the given command string, if not added yet.
|
|
76
|
-
|
|
77
|
-
Args:
|
|
78
|
-
- cmd_string: Command string.
|
|
79
|
-
|
|
80
|
-
Returns: Given command string with a line feed appended (if not present yet).
|
|
81
|
-
"""
|
|
82
|
-
|
|
83
|
-
if not cmd_string.endswith(LINE_FEED):
|
|
84
|
-
|
|
85
|
-
cmd_string += LINE_FEED
|
|
86
|
-
|
|
87
|
-
return cmd_string
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def add_cr_lf(cmd_string: str):
|
|
91
|
-
""" Add a carriage return and line feed to the given command string, if not added yet.
|
|
92
|
-
|
|
93
|
-
Args:
|
|
94
|
-
- cmd_string: Command string.
|
|
95
|
-
|
|
96
|
-
Returns: Given command string with a carriage return and line feed appended (if not present yet).
|
|
97
|
-
"""
|
|
98
|
-
|
|
99
|
-
if not cmd_string.endswith(CARRIAGE_RETURN + LINE_FEED):
|
|
100
|
-
|
|
101
|
-
cmd_string += CARRIAGE_RETURN + LINE_FEED
|
|
102
|
-
|
|
103
|
-
return cmd_string
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
def expand_kwargs(kwargs: Dict):
|
|
107
|
-
"""Expand keyword arguments and their values as 'key=value' separated by spaces."""
|
|
108
|
-
return " ".join(f"{k}={v}" for k, v in kwargs.items())
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def dynamic_command(
|
|
112
|
-
*,
|
|
113
|
-
cmd_type: str, # required keyword-only argument
|
|
114
|
-
cmd_string: str = None,
|
|
115
|
-
process_response: Callable = None,
|
|
116
|
-
process_cmd_string: Callable = None,
|
|
117
|
-
process_kwargs: Callable = None,
|
|
118
|
-
use_format: bool = False,
|
|
119
|
-
pre_cmd: Callable = None,
|
|
120
|
-
post_cmd: Callable = None,
|
|
121
|
-
):
|
|
122
|
-
"""Convert an interface method into a dynamic command.
|
|
123
|
-
|
|
124
|
-
The arguments define the type of command and how the response shall be processed.
|
|
125
|
-
|
|
126
|
-
The command types 'write', 'query', and 'transaction' must be accompanied by a `cmd_string`
|
|
127
|
-
argument that defines the formatting of the eventual command string that will be passed to
|
|
128
|
-
the transport functions. The `cmd_string` is a template string that contains `$`-based
|
|
129
|
-
substitutions for the function arguments. When you specify the `use_format=True` keyword,
|
|
130
|
-
the `cmd_string` will be formatted using the format() function instead of the template
|
|
131
|
-
substitution. The format option is less secure, but provides the functionality to format
|
|
132
|
-
the arguments.
|
|
133
|
-
|
|
134
|
-
A template string looks like:
|
|
135
|
-
|
|
136
|
-
cmd_string="CREATE:SENS:TEMP ${name} ${type} default=${default}"
|
|
137
|
-
|
|
138
|
-
The same `cmd_string` as a format option:
|
|
139
|
-
|
|
140
|
-
cmd_string="CREATE:SENS:TEMP {name} {type} default={default:0.4f}"
|
|
141
|
-
use_format=True
|
|
142
|
-
|
|
143
|
-
The process_response and process_cmd_string keywords allow you to specify a pure function to
|
|
144
|
-
process the response before it is returned, and to process the cmd_string before it is sent
|
|
145
|
-
to the transport function.
|
|
146
|
-
|
|
147
|
-
The `pre_cmd` and `post_cmd` keywords specify a callable/function to be executed before and/or
|
|
148
|
-
after the actual command was executed (i.e. send to the device). These functions are called
|
|
149
|
-
with specific keyword arguments that allow additional device interaction and response processing.
|
|
150
|
-
The `pre_cmd` function is called with the keyword argument `transport=` which passes the device
|
|
151
|
-
transport. This allows the function to interact with the device again through the methods defined
|
|
152
|
-
by the DeviceTransport interface. The `pre_cmd` function must not return anything.
|
|
153
|
-
The `post_cmd` function is called with the keyword arguments `transport=` and `response=`.
|
|
154
|
-
The response argument contains the response from the command that was previously sent to the
|
|
155
|
-
device. The `post_cmd` function can use this response to parse its content and act against
|
|
156
|
-
this content, although possible, it is usually not a good idea to alter the content of the
|
|
157
|
-
response argument. The `post_cmd` function shall return (i.e. pass through) the response.
|
|
158
|
-
|
|
159
|
-
This decorator can add the following static attributes to the method:
|
|
160
|
-
|
|
161
|
-
* __dynamic_interface
|
|
162
|
-
* __read_command, __write_command, __query_command, __transaction_command
|
|
163
|
-
* __cmd_string
|
|
164
|
-
* __process_response
|
|
165
|
-
* __process_cmd_string
|
|
166
|
-
* __use_format
|
|
167
|
-
* __pre_cmd
|
|
168
|
-
* __post_cmd
|
|
169
|
-
|
|
170
|
-
Args:
|
|
171
|
-
cmd_type (str): one of 'read', 'write', 'query', or 'transaction' [required keyword]
|
|
172
|
-
cmd_string (str): format string for the generation of the instrument command
|
|
173
|
-
process_response (Callable): function to process the response
|
|
174
|
-
process_cmd_string (Callable): function to process the command string after substitution
|
|
175
|
-
process_kwargs (Callable): function to expand the kwargs after substitution
|
|
176
|
-
use_format (bool): use string formatting instead of string templates
|
|
177
|
-
pre_cmd (Callable): the function to execute before the command is executed
|
|
178
|
-
post_cmd (Callable): the function to execute after the command is executed
|
|
179
|
-
"""
|
|
180
|
-
|
|
181
|
-
# Perform some checks on required arguments
|
|
182
|
-
|
|
183
|
-
if cmd_type not in COMMAND_TYPES:
|
|
184
|
-
raise ValueError(f"Unknown type passed into dynamic command decorator: {type=}")
|
|
185
|
-
|
|
186
|
-
if cmd_type in ('write', 'query', 'transaction') and cmd_string is None:
|
|
187
|
-
raise ValueError(f"No cmd_string was provided for {cmd_type=}.")
|
|
188
|
-
|
|
189
|
-
def func_wrapper(func: Callable):
|
|
190
|
-
"""Adds the different static attributes."""
|
|
191
|
-
|
|
192
|
-
setattr(func, "__dynamic_interface", True)
|
|
193
|
-
|
|
194
|
-
setattr(func, COMMAND_TYPES[cmd_type], True)
|
|
195
|
-
|
|
196
|
-
if cmd_string is not None:
|
|
197
|
-
setattr(func, "__cmd_string", cmd_string)
|
|
198
|
-
|
|
199
|
-
if process_response is not None:
|
|
200
|
-
setattr(func, "__process_response", process_response)
|
|
201
|
-
|
|
202
|
-
if process_cmd_string is not None:
|
|
203
|
-
setattr(func, "__process_cmd_string", process_cmd_string)
|
|
204
|
-
|
|
205
|
-
if process_kwargs is not None:
|
|
206
|
-
setattr(func, "__process_kwargs", process_kwargs)
|
|
207
|
-
|
|
208
|
-
if use_format:
|
|
209
|
-
setattr(func, "__use_format", True)
|
|
210
|
-
|
|
211
|
-
if pre_cmd is not None:
|
|
212
|
-
setattr(func, "__pre_cmd", pre_cmd)
|
|
213
|
-
|
|
214
|
-
if post_cmd is not None:
|
|
215
|
-
setattr(func, "__post_cmd", post_cmd)
|
|
216
|
-
|
|
217
|
-
return func
|
|
218
|
-
|
|
219
|
-
return func_wrapper
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
class DynamicCommandMixin:
|
|
223
|
-
"""
|
|
224
|
-
This Mixin class defines the functionality to dynamically call specific instrument commands
|
|
225
|
-
from methods that are defined in the Interface classes for device Controllers.
|
|
226
|
-
|
|
227
|
-
The mixin uses the `self.transport` instance variables that shall be defined by the
|
|
228
|
-
Controller sub-class. The `self.transport` shall be a DeviceTransport object providing the
|
|
229
|
-
methods to read, write, and query an instrument.
|
|
230
|
-
|
|
231
|
-
!!! note
|
|
232
|
-
This mixin overrides the `__getattribute__` method!
|
|
233
|
-
|
|
234
|
-
!!! note
|
|
235
|
-
This mixin class shall only be inherited from a Controller class that defines the
|
|
236
|
-
`self.transport` attribute.
|
|
237
|
-
"""
|
|
238
|
-
|
|
239
|
-
def __init__(self):
|
|
240
|
-
if not hasattr(self, "transport"):
|
|
241
|
-
raise AttributeError("Transport was not defined in sub-class of DynamicInterfaceMixin")
|
|
242
|
-
|
|
243
|
-
@staticmethod
|
|
244
|
-
def create_command_string(func: Callable, template_str: str, *args, **kwargs):
|
|
245
|
-
"""
|
|
246
|
-
Creates a command string that is understood by the instrument. This can be an SCPI
|
|
247
|
-
command or a specific proprietary command string. The `cmd_str` can contain placeholders
|
|
248
|
-
similar to what is used in string formatting.
|
|
249
|
-
|
|
250
|
-
As an example, we have a function with two positional arguments 'a', and 'b' and one keyword
|
|
251
|
-
argument flag:
|
|
252
|
-
|
|
253
|
-
def func(a, b, flag=True):
|
|
254
|
-
pass
|
|
255
|
-
|
|
256
|
-
We have the following template string: `CREATE:FUN:${a} ${b} [${flag}]`.
|
|
257
|
-
|
|
258
|
-
When we call the function as follows: `func("TEMP", 23)`, we would then expect
|
|
259
|
-
the returned string to be "CREATE:FUN:TEMP 23 [True]"
|
|
260
|
-
|
|
261
|
-
DynamicCommandMixin.create_command_string(func, template, "TEMP", 23)
|
|
262
|
-
|
|
263
|
-
Args:
|
|
264
|
-
func (Callable): a function or method that provides the signature
|
|
265
|
-
template_str (str): a template for the command
|
|
266
|
-
args (tuple): positional arguments that will be used in the command string
|
|
267
|
-
kwargs (dict): keywords arguments that will be used in the command string
|
|
268
|
-
"""
|
|
269
|
-
try:
|
|
270
|
-
process_kwargs = getattr(func, "__process_kwargs")
|
|
271
|
-
except AttributeError:
|
|
272
|
-
process_kwargs = expand_kwargs
|
|
273
|
-
|
|
274
|
-
template = string.Template(template_str)
|
|
275
|
-
|
|
276
|
-
sig = inspect.signature(func)
|
|
277
|
-
try:
|
|
278
|
-
bound = sig.bind(*args, **kwargs)
|
|
279
|
-
except TypeError as exc:
|
|
280
|
-
raise CommandError(
|
|
281
|
-
f"Arguments {args}, {kwargs} do not match function signature for "
|
|
282
|
-
f"{func.__name__}{sig}") from exc
|
|
283
|
-
|
|
284
|
-
variables = {}
|
|
285
|
-
for idx, par in enumerate(sig.parameters.values()):
|
|
286
|
-
# if the argument is of signature '**kwargs' then expand the kwargs
|
|
287
|
-
if par.kind == inspect.Parameter.VAR_KEYWORD:
|
|
288
|
-
variables[par.name] = process_kwargs(bound.arguments[par.name])
|
|
289
|
-
continue
|
|
290
|
-
|
|
291
|
-
# otherwise, use the argument value or the default
|
|
292
|
-
try:
|
|
293
|
-
variables[par.name] = bound.arguments[par.name]
|
|
294
|
-
except KeyError:
|
|
295
|
-
variables[par.name] = par.default
|
|
296
|
-
|
|
297
|
-
if hasattr(func, "__use_format"):
|
|
298
|
-
cmd_string = template_str.format(**variables)
|
|
299
|
-
else:
|
|
300
|
-
variables = {
|
|
301
|
-
k: v.value if isinstance(v, enum.Enum) else v
|
|
302
|
-
for k, v in variables.items()
|
|
303
|
-
}
|
|
304
|
-
cmd_string = template.safe_substitute(variables)
|
|
305
|
-
|
|
306
|
-
try:
|
|
307
|
-
process_cmd_string = getattr(func, "__process_cmd_string")
|
|
308
|
-
cmd_string = process_cmd_string(cmd_string)
|
|
309
|
-
except AttributeError:
|
|
310
|
-
pass
|
|
311
|
-
|
|
312
|
-
return cmd_string
|
|
313
|
-
|
|
314
|
-
def handle_dynamic_command(self, attr):
|
|
315
|
-
"""
|
|
316
|
-
Creates a command wrapper calling the appropriate transport methods that are associated
|
|
317
|
-
with the interface definition as passed into this method with the attr argument.
|
|
318
|
-
|
|
319
|
-
Args:
|
|
320
|
-
attr: The interface method that is decorated as a dynamic_command.
|
|
321
|
-
|
|
322
|
-
Returns:
|
|
323
|
-
Command wrapper with the read or write command, depending on the decorators used
|
|
324
|
-
for that method in the corresponding Interface class.
|
|
325
|
-
|
|
326
|
-
Raises:
|
|
327
|
-
AttributeError: If the command is not listed in the YAML file and/or
|
|
328
|
-
has not been listed.
|
|
329
|
-
"""
|
|
330
|
-
|
|
331
|
-
@functools.wraps(attr)
|
|
332
|
-
def command_wrapper(*args, **kwargs):
|
|
333
|
-
"""Generates command strings and executes the transport functions."""
|
|
334
|
-
try:
|
|
335
|
-
cmd_str = getattr(attr, "__cmd_string")
|
|
336
|
-
cmd_str = self.create_command_string(attr, cmd_str, *args, **kwargs)
|
|
337
|
-
except AttributeError:
|
|
338
|
-
cmd_str = None
|
|
339
|
-
|
|
340
|
-
response = None
|
|
341
|
-
|
|
342
|
-
with contextlib.suppress(AttributeError):
|
|
343
|
-
getattr(attr, "__pre_cmd")(transport=self.transport,
|
|
344
|
-
function_name=attr.__name__, cmd_str=cmd_str, args=args, kwargs=kwargs)
|
|
345
|
-
|
|
346
|
-
if hasattr(attr, "__write_command"):
|
|
347
|
-
self.transport.write(cmd_str)
|
|
348
|
-
elif hasattr(attr, "__read_command"):
|
|
349
|
-
response = self.transport.read()
|
|
350
|
-
elif hasattr(attr, "__query_command"):
|
|
351
|
-
response = self.transport.query(cmd_str)
|
|
352
|
-
elif hasattr(attr, "__transaction_command"):
|
|
353
|
-
response = self.transport.trans(cmd_str)
|
|
354
|
-
else:
|
|
355
|
-
raise CommandError(f"Interface method '{attr.__name__}' shall be decorated with "
|
|
356
|
-
f"a command type decorator.")
|
|
357
|
-
|
|
358
|
-
with contextlib.suppress(AttributeError):
|
|
359
|
-
response = getattr(attr, "__post_cmd")(transport=self.transport, response=response)
|
|
360
|
-
|
|
361
|
-
with contextlib.suppress(AttributeError):
|
|
362
|
-
process_response = getattr(attr, "__process_response")
|
|
363
|
-
response = process_response(response=response)
|
|
364
|
-
|
|
365
|
-
return response
|
|
366
|
-
|
|
367
|
-
# Add a hook to identify the command_wrapper function as a method, instead of a function.
|
|
368
|
-
|
|
369
|
-
setattr(command_wrapper, "__method_wrapper", True)
|
|
370
|
-
|
|
371
|
-
# Add the docstring of the interface method
|
|
372
|
-
|
|
373
|
-
command_wrapper.__doc__ = attr.__doc__
|
|
374
|
-
|
|
375
|
-
return command_wrapper
|
|
376
|
-
|
|
377
|
-
def __getattribute__(self, item):
|
|
378
|
-
"""
|
|
379
|
-
The function __getattribute__() is called unconditionally when calling a method or accessing
|
|
380
|
-
an instance variable. This override of `__getattribute__` additionally checks if the
|
|
381
|
-
attribute is a method which has the `__dynamic_interface` defined and then calls a specific
|
|
382
|
-
function to handle the command dynamically.
|
|
383
|
-
|
|
384
|
-
Check if item exists:
|
|
385
|
-
- if `item` exists and has the __dynamic_interface attribute then let the function
|
|
386
|
-
handle_dynamic_command() handle this, i.e. call the instrument command.
|
|
387
|
-
- else: the method has been defined in the Controller class, and we should just call
|
|
388
|
-
that method (because it is overridden).
|
|
389
|
-
"""
|
|
390
|
-
|
|
391
|
-
# If item is not known, an AttributeError will be raised and __getattr__() will be called.
|
|
392
|
-
|
|
393
|
-
attr = object.__getattribute__(self, item)
|
|
394
|
-
|
|
395
|
-
if hasattr(attr, "__dynamic_interface"):
|
|
396
|
-
|
|
397
|
-
# We come here when the method is defined in the Interface class (where it is
|
|
398
|
-
# decorated with the @dynamic_interface), but not in the sub-class. So, the method
|
|
399
|
-
# is not overridden. We let the handle_dynamic_command() method handle this.
|
|
400
|
-
|
|
401
|
-
attr = self.handle_dynamic_command(attr)
|
|
402
|
-
|
|
403
|
-
return attr
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
class DynamicClientCommandMixin:
|
|
407
|
-
"""
|
|
408
|
-
This mixin class contains functionality to forward a device command from a client Proxy class
|
|
409
|
-
to its control server.
|
|
410
|
-
|
|
411
|
-
!!! note
|
|
412
|
-
This mixin overrides the `__getattribute__` method!
|
|
413
|
-
|
|
414
|
-
"""
|
|
415
|
-
def __getattribute__(self, item):
|
|
416
|
-
# If item is not known, an AttributeError will be raised and __getattr__() will be called.
|
|
417
|
-
|
|
418
|
-
attr = object.__getattribute__(self, item)
|
|
419
|
-
|
|
420
|
-
if hasattr(attr, "__dynamic_interface"):
|
|
421
|
-
|
|
422
|
-
# We come here when the method is defined in the Interface class (where it is
|
|
423
|
-
# decorated with the @dynamic_interface), but not in the sub-class. So, the method
|
|
424
|
-
# is not overridden. We let the handle_dynamic_command() method handle this.
|
|
425
|
-
|
|
426
|
-
attr = self.handle_dynamic_command(attr)
|
|
427
|
-
|
|
428
|
-
return attr
|
|
429
|
-
|
|
430
|
-
def handle_dynamic_command(self, attr):
|
|
431
|
-
|
|
432
|
-
@functools.wraps(attr)
|
|
433
|
-
def command_wrapper(*args, **kwargs):
|
|
434
|
-
|
|
435
|
-
attr_name = getattr(attr, "__name__")
|
|
436
|
-
|
|
437
|
-
# This will ensure that the function is called with the proper arguments
|
|
438
|
-
|
|
439
|
-
try:
|
|
440
|
-
inspect.signature(attr).bind(*args, **kwargs)
|
|
441
|
-
except TypeError as exc:
|
|
442
|
-
LOGGER.error(f"Arguments do not match the signature of the function '{attr_name}': {exc}")
|
|
443
|
-
return None
|
|
444
|
-
|
|
445
|
-
# Create a command execution to pass the commanded function and the given arguments
|
|
446
|
-
# to the control server for execution.
|
|
447
|
-
|
|
448
|
-
device_method = get_function(self.__class__, attr_name)
|
|
449
|
-
cmd = ClientServerCommand(name=attr_name,
|
|
450
|
-
cmd=getattr(attr, "__cmd_string", ""),
|
|
451
|
-
response=DynamicCommandProtocol.handle_device_method,
|
|
452
|
-
device_method=device_method)
|
|
453
|
-
ce = CommandExecution(cmd, *args, **kwargs)
|
|
454
|
-
|
|
455
|
-
# Send the command to the control server for execution
|
|
456
|
-
|
|
457
|
-
rc = self.send(ce)
|
|
458
|
-
return rc
|
|
459
|
-
|
|
460
|
-
# rewrite the proper signature for the called function
|
|
461
|
-
|
|
462
|
-
command_wrapper.__signature__ = inspect.signature(attr)
|
|
463
|
-
|
|
464
|
-
return command_wrapper
|
egse/monitoring.py
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import multiprocessing
|
|
3
|
-
import pickle
|
|
4
|
-
|
|
5
|
-
import click
|
|
6
|
-
import rich
|
|
7
|
-
import zmq
|
|
8
|
-
|
|
9
|
-
from egse.control import ControlServer
|
|
10
|
-
from egse.protocol import CommandProtocol
|
|
11
|
-
from egse.system import format_datetime
|
|
12
|
-
from egse.zmq import MessageIdentifier
|
|
13
|
-
from egse.zmq_ser import bind_address
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger("egse.monitoring")
|
|
16
|
-
|
|
17
|
-
class MonitoringProtocol(CommandProtocol):
|
|
18
|
-
def __init__(self, control_server: ControlServer):
|
|
19
|
-
super().__init__()
|
|
20
|
-
self.control_server = control_server
|
|
21
|
-
|
|
22
|
-
def get_bind_address(self):
|
|
23
|
-
return bind_address(self.control_server.get_communication_protocol(), self.control_server.get_monitoring_port())
|
|
24
|
-
|
|
25
|
-
def get_status(self):
|
|
26
|
-
return {
|
|
27
|
-
'timestamp': format_datetime(),
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
def send_status(self, status):
|
|
31
|
-
self.send(status)
|
|
32
|
-
|
|
33
|
-
def get_housekeeping(self) -> dict:
|
|
34
|
-
return {
|
|
35
|
-
'timestamp': format_datetime(),
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@click.command()
|
|
41
|
-
@click.argument('hostname')
|
|
42
|
-
@click.argument('port')
|
|
43
|
-
@click.option('--subscribe', '-s', default=('ALL',), multiple=True,
|
|
44
|
-
help="subscribe to a sync identifier, can appear multiple times")
|
|
45
|
-
@click.option('--multipart', '-m', is_flag=True, default=False, help="use multipart messages")
|
|
46
|
-
@click.option('--pickle/--no-pickle', 'use_pickle', default=True)
|
|
47
|
-
def monitoring(hostname: str, port: int, subscribe: str, multipart: bool, use_pickle: bool):
|
|
48
|
-
"""Monitor the status of a control server on hostname:port.
|
|
49
|
-
|
|
50
|
-
The port number shall correspond to the port number on which the control server is publishing
|
|
51
|
-
status information.
|
|
52
|
-
"""
|
|
53
|
-
context = zmq.Context()
|
|
54
|
-
|
|
55
|
-
receiver = context.socket(zmq.SUB)
|
|
56
|
-
receiver.connect(f"tcp://{hostname}:{port}")
|
|
57
|
-
|
|
58
|
-
for item in subscribe:
|
|
59
|
-
sync_id = 0
|
|
60
|
-
try:
|
|
61
|
-
sync_id = MessageIdentifier[item.upper()]
|
|
62
|
-
except KeyError:
|
|
63
|
-
rich.print(f"[red]ERROR: incorrect subscribe identifier, "
|
|
64
|
-
f"use one of {[x.name for x in MessageIdentifier]}")
|
|
65
|
-
ctx = click.get_current_context()
|
|
66
|
-
rich.print(ctx.get_help())
|
|
67
|
-
ctx.exit()
|
|
68
|
-
|
|
69
|
-
if sync_id == MessageIdentifier.ALL:
|
|
70
|
-
subscribe_string = b''
|
|
71
|
-
else:
|
|
72
|
-
subscribe_string = sync_id.to_bytes(1, byteorder='big')
|
|
73
|
-
|
|
74
|
-
receiver.subscribe(subscribe_string)
|
|
75
|
-
|
|
76
|
-
while True:
|
|
77
|
-
try:
|
|
78
|
-
if multipart:
|
|
79
|
-
sync_id, message = receiver.recv_multipart()
|
|
80
|
-
sync_id = int.from_bytes(sync_id, byteorder='big')
|
|
81
|
-
else:
|
|
82
|
-
sync_id = MessageIdentifier.ALL
|
|
83
|
-
message = receiver.recv()
|
|
84
|
-
response = pickle.loads(message) if use_pickle else message
|
|
85
|
-
rich.print(f"{MessageIdentifier(sync_id).name}, {response}", flush=True)
|
|
86
|
-
except KeyboardInterrupt:
|
|
87
|
-
logger.info("KeyboardInterrupt caught!")
|
|
88
|
-
break
|
|
89
|
-
|
|
90
|
-
receiver.close(linger=0)
|
|
91
|
-
context.term()
|
|
92
|
-
|
|
93
|
-
if __name__ == "__main__":
|
|
94
|
-
multiprocessing.current_process().name = "Monitoring"
|
|
95
|
-
monitoring()
|
egse/ni/alarms/__init__.py
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Device control for the NI cdaq9375 that will be used at IAS for alarm manager.
|
|
3
|
-
|
|
4
|
-
This package contains the classes and modules to work with the Labview code running on Windows Keynes dealing with
|
|
5
|
-
CDAQ9375 .
|
|
6
|
-
|
|
7
|
-
The main entry point for the user of this package is through the `cdaq9375Proxy` class:
|
|
8
|
-
|
|
9
|
-
```python
|
|
10
|
-
>>> from egse.ni.alarms.cdaq9375 import cdaq9375Proxy
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
This class will connect to the control server of the CDAQ 9375 Controller and provides all
|
|
14
|
-
commands to
|
|
15
|
-
get alarms from the 2 EGSE UPS and from TVAC and send EGSE alarms to TVAC. The control server is a small
|
|
16
|
-
server application
|
|
17
|
-
that is started as shown below. The control server directly connects to the cdaq9375 readout Controller
|
|
18
|
-
through an Ethernet
|
|
19
|
-
interface. When you have no hardware available, the control server can be started in simulator
|
|
20
|
-
mode by appending the
|
|
21
|
-
`--sim` string to the command below.
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
$ python -m egse.ni.alarms.cdaq9375_cs
|
|
25
|
-
```
|
|
26
|
-
"""
|