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/confman/setup_ui.py
DELETED
|
@@ -1,565 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
|
|
4
|
-
import sys
|
|
5
|
-
from PyQt5.QtCore import Qt, QLockFile
|
|
6
|
-
from PyQt5.QtGui import QIcon
|
|
7
|
-
from PyQt5.QtGui import QPixmap
|
|
8
|
-
from PyQt5.QtWidgets import QAction, QListWidget, QMessageBox
|
|
9
|
-
from PyQt5.QtWidgets import QApplication
|
|
10
|
-
from PyQt5.QtWidgets import QFrame
|
|
11
|
-
from PyQt5.QtWidgets import QGroupBox
|
|
12
|
-
from PyQt5.QtWidgets import QHBoxLayout
|
|
13
|
-
from PyQt5.QtWidgets import QLineEdit
|
|
14
|
-
from PyQt5.QtWidgets import QMainWindow
|
|
15
|
-
from PyQt5.QtWidgets import QPushButton
|
|
16
|
-
from PyQt5.QtWidgets import QSplitter
|
|
17
|
-
from PyQt5.QtWidgets import QTabWidget
|
|
18
|
-
from PyQt5.QtWidgets import QTextBrowser
|
|
19
|
-
from PyQt5.QtWidgets import QVBoxLayout
|
|
20
|
-
from rich.console import Console
|
|
21
|
-
|
|
22
|
-
from egse.config import find_file
|
|
23
|
-
from egse.config import get_common_egse_root
|
|
24
|
-
from egse.confman import ConfigurationManagerProxy
|
|
25
|
-
from egse.control import Failure
|
|
26
|
-
from egse.gui import show_warning_message, VLine, show_info_message
|
|
27
|
-
from egse.resource import get_resource
|
|
28
|
-
from egse.settings import Settings
|
|
29
|
-
from egse.system import replace_environment_variable
|
|
30
|
-
|
|
31
|
-
logging.basicConfig(level=logging.INFO, format=Settings.LOG_FORMAT_FULL)
|
|
32
|
-
|
|
33
|
-
LOGGER = logging.getLogger(__name__)
|
|
34
|
-
|
|
35
|
-
SITE = Settings.load("SITE")["ID"]
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class SetupUIView(QMainWindow):
|
|
39
|
-
|
|
40
|
-
def __init__(self):
|
|
41
|
-
""" Initialisation of the GUI to inspect the available setups.
|
|
42
|
-
|
|
43
|
-
The components are placed in the window:
|
|
44
|
-
- on the left-hand side: filtering of the setups + list with the setups that meet the conditions from the
|
|
45
|
-
filter;
|
|
46
|
-
- right-hand side: tabs with setup that were opened for visual inspection.
|
|
47
|
-
"""
|
|
48
|
-
|
|
49
|
-
super().__init__()
|
|
50
|
-
|
|
51
|
-
self.setGeometry(300, 300, 1200, 1000)
|
|
52
|
-
|
|
53
|
-
cm_ctrl_settings = Settings.load("Configuration Manager Control Server")
|
|
54
|
-
location = replace_environment_variable(cm_ctrl_settings.FILE_STORAGE_LOCATION)
|
|
55
|
-
self._data_conf_location = Path(location) if location else get_common_egse_root()
|
|
56
|
-
|
|
57
|
-
self.setWindowTitle(f"Available Setups ({self._data_conf_location})")
|
|
58
|
-
|
|
59
|
-
# Build up the GUI
|
|
60
|
-
|
|
61
|
-
self.toolbar = self.addToolBar("MainToolbar")
|
|
62
|
-
|
|
63
|
-
self.filter = QLineEdit()
|
|
64
|
-
self.filter_list = QListWidget()
|
|
65
|
-
self.tabbed_widget = QTabWidget()
|
|
66
|
-
|
|
67
|
-
self.init_ui()
|
|
68
|
-
|
|
69
|
-
# Keep track of which setups have been opened in a tab
|
|
70
|
-
|
|
71
|
-
self.open_tabs = []
|
|
72
|
-
|
|
73
|
-
def resizeEvent(self, event):
|
|
74
|
-
""" Re-sizing of the main window.
|
|
75
|
-
|
|
76
|
-
Args:
|
|
77
|
-
- event: Re-size event.
|
|
78
|
-
"""
|
|
79
|
-
|
|
80
|
-
QMainWindow.resizeEvent(self, event)
|
|
81
|
-
self.filter_list.setMinimumSize(self.width() / 2 - 50, self.height() - 200)
|
|
82
|
-
|
|
83
|
-
def init_ui(self):
|
|
84
|
-
""" Put the components in the GUI window.
|
|
85
|
-
|
|
86
|
-
The GUI comprises the following components:
|
|
87
|
-
- on the left-hand side: filtering of the setups + list with the setups that meet the conditions from the
|
|
88
|
-
filter;
|
|
89
|
-
- right-hand side: tabs with setup that were opened for visual inspection.
|
|
90
|
-
"""
|
|
91
|
-
|
|
92
|
-
# Creating the content
|
|
93
|
-
|
|
94
|
-
app_frame = QFrame()
|
|
95
|
-
app_frame.setObjectName("AppFrame")
|
|
96
|
-
|
|
97
|
-
self.create_toolbar()
|
|
98
|
-
self.create_statusbar()
|
|
99
|
-
|
|
100
|
-
# Left-hand side: filtering + drop-down menu
|
|
101
|
-
|
|
102
|
-
lhs_layout = QVBoxLayout()
|
|
103
|
-
lhs_frame = QFrame()
|
|
104
|
-
|
|
105
|
-
filter_widget = self.make_filter_widget()
|
|
106
|
-
self.update_list()
|
|
107
|
-
|
|
108
|
-
lhs_layout.addWidget(filter_widget)
|
|
109
|
-
lhs_layout.addWidget(self.filter_list)
|
|
110
|
-
|
|
111
|
-
lhs_layout.addStretch()
|
|
112
|
-
lhs_frame.setLayout(lhs_layout)
|
|
113
|
-
|
|
114
|
-
# Right-hand side: tabs
|
|
115
|
-
|
|
116
|
-
self.make_tabbed_widget()
|
|
117
|
-
|
|
118
|
-
# Put everything together
|
|
119
|
-
|
|
120
|
-
layout = QHBoxLayout()
|
|
121
|
-
splitter = QSplitter(Qt.Horizontal)
|
|
122
|
-
|
|
123
|
-
splitter.addWidget(lhs_frame)
|
|
124
|
-
splitter.addWidget(self.tabbed_widget)
|
|
125
|
-
splitter.setSizes([500, 1000])
|
|
126
|
-
|
|
127
|
-
layout.addWidget(splitter)
|
|
128
|
-
app_frame.setLayout(layout)
|
|
129
|
-
|
|
130
|
-
self.setCentralWidget(app_frame)
|
|
131
|
-
|
|
132
|
-
def create_toolbar(self):
|
|
133
|
-
""" Configure the toolbar.
|
|
134
|
-
|
|
135
|
-
The toolbar comprises a single button that allows you to load the setup that is shown in the active tab.
|
|
136
|
-
"""
|
|
137
|
-
|
|
138
|
-
load_setup_pix = QPixmap(str(find_file("load.png", in_dir="images")))
|
|
139
|
-
load_setup_icon = QIcon()
|
|
140
|
-
load_setup_icon.addPixmap(load_setup_pix, QIcon.Normal, QIcon.On)
|
|
141
|
-
|
|
142
|
-
load_setup_action = QAction(load_setup_icon, "Load the current setup", self)
|
|
143
|
-
load_setup_action.setStatusTip("Load setup shown in the active tab.")
|
|
144
|
-
load_setup_action.setCheckable(False)
|
|
145
|
-
load_setup_action.triggered.connect(self.load_setup)
|
|
146
|
-
|
|
147
|
-
self.toolbar.addAction(load_setup_action)
|
|
148
|
-
|
|
149
|
-
return self.toolbar
|
|
150
|
-
|
|
151
|
-
def create_statusbar(self):
|
|
152
|
-
""" Create a status bar.
|
|
153
|
-
|
|
154
|
-
Returns: Status bar.
|
|
155
|
-
"""
|
|
156
|
-
|
|
157
|
-
self.statusBar().setStyleSheet("border: 0; background-color: #FFF8DC;")
|
|
158
|
-
self.statusBar().setStyleSheet("QStatusBar::item {border: none;}")
|
|
159
|
-
self.statusBar().addPermanentWidget(VLine())
|
|
160
|
-
|
|
161
|
-
def load_setup(self):
|
|
162
|
-
"""Load the setup that is shown in the active tab. """
|
|
163
|
-
|
|
164
|
-
current_widget = self.tabbed_widget.currentWidget()
|
|
165
|
-
|
|
166
|
-
if current_widget is None:
|
|
167
|
-
|
|
168
|
-
description = "No setup selected."
|
|
169
|
-
info_text = "You can view setup files by selecting them in the list. They will be opened in " \
|
|
170
|
-
+ "individual tabs on the right-hand side. \n\nTo be able to load a specific setup, bring " \
|
|
171
|
-
+ "the corresponding tab into focus."
|
|
172
|
-
|
|
173
|
-
show_warning_message(description, info_text=info_text)
|
|
174
|
-
|
|
175
|
-
else:
|
|
176
|
-
|
|
177
|
-
site, setup_id = current_widget.accessibleName().split(" ")
|
|
178
|
-
|
|
179
|
-
if site == SITE:
|
|
180
|
-
|
|
181
|
-
try:
|
|
182
|
-
|
|
183
|
-
with ConfigurationManagerProxy() as cm:
|
|
184
|
-
|
|
185
|
-
load_result = cm.load_setup(int(setup_id))
|
|
186
|
-
|
|
187
|
-
if isinstance(load_result, Failure):
|
|
188
|
-
|
|
189
|
-
description = f"Setup {setup_id} could not be loaded for {site}"
|
|
190
|
-
info_text = load_result.message
|
|
191
|
-
|
|
192
|
-
show_warning_message(description, info_text=info_text)
|
|
193
|
-
|
|
194
|
-
else:
|
|
195
|
-
|
|
196
|
-
description = f"Loaded setup {setup_id} for {site}"
|
|
197
|
-
show_info_message(description)
|
|
198
|
-
|
|
199
|
-
except ConnectionError:
|
|
200
|
-
|
|
201
|
-
description = "Connection with Configuration Manager was lost."
|
|
202
|
-
info_text = "Check the status of the core services (and re-start when necessary)"
|
|
203
|
-
show_warning_message(description, info_text=info_text)
|
|
204
|
-
|
|
205
|
-
else:
|
|
206
|
-
|
|
207
|
-
description = "Wrong site ID."
|
|
208
|
-
info_text = f"The site ID mentioned in the setup file ({site}) does not match the site you are at " \
|
|
209
|
-
+ "f({SITE}), according to the settings file. Therefore, loading this setup was prevented."
|
|
210
|
-
show_warning_message(description, info_text=info_text)
|
|
211
|
-
|
|
212
|
-
def make_filter_widget(self):
|
|
213
|
-
""" Make widget where the available setups can be filtered:
|
|
214
|
-
|
|
215
|
-
This widgets consists of the following elements:
|
|
216
|
-
- text field in which the filter can be specified: when the return key is pressed, the filter is applied
|
|
217
|
-
(i.e. all tabs are closed and the drop-down menu is updated);
|
|
218
|
-
- search button: when this is pressed, the filter is applied (i.e. all tabs are closed and the list is
|
|
219
|
-
updated);
|
|
220
|
-
- clear button: when this is pressed, the filter is cleared (i.e. all tabs are closed and the list is
|
|
221
|
-
updated).
|
|
222
|
-
"""
|
|
223
|
-
|
|
224
|
-
layout = QHBoxLayout()
|
|
225
|
-
|
|
226
|
-
widget = QGroupBox("Filter", self)
|
|
227
|
-
|
|
228
|
-
# Text field for the filter
|
|
229
|
-
|
|
230
|
-
self.filter.returnPressed.connect(self.apply_filter)
|
|
231
|
-
self.filter.setStatusTip("Filtering of available setups, e.g. " +
|
|
232
|
-
"site_id=\"CSL\", gse.hexapod.ID=2, camera.model=\"STM\".")
|
|
233
|
-
layout.addWidget(self.filter)
|
|
234
|
-
|
|
235
|
-
# Search button
|
|
236
|
-
|
|
237
|
-
search_icon = QIcon(str(find_file("search.png", in_dir="images")))
|
|
238
|
-
search_button = QPushButton()
|
|
239
|
-
search_button.setIcon(search_icon)
|
|
240
|
-
search_button.setStatusTip("Apply filter (alternatively hit return key in the text field).")
|
|
241
|
-
search_button.clicked.connect(self.apply_filter)
|
|
242
|
-
|
|
243
|
-
layout.addWidget(search_button)
|
|
244
|
-
|
|
245
|
-
# Clear button
|
|
246
|
-
|
|
247
|
-
clear_icon = QIcon(str(find_file("cross.svg", in_dir="images")))
|
|
248
|
-
clear_button = QPushButton()
|
|
249
|
-
clear_button.setIcon(clear_icon)
|
|
250
|
-
clear_button.setStatusTip("Clear filter.")
|
|
251
|
-
clear_button.clicked.connect(self.clear_filter)
|
|
252
|
-
|
|
253
|
-
layout.addWidget(clear_button)
|
|
254
|
-
|
|
255
|
-
widget.setLayout(layout)
|
|
256
|
-
|
|
257
|
-
# Make the drop-down menu listen to selections
|
|
258
|
-
|
|
259
|
-
self.filter_list.currentTextChanged.connect(self.view_setup)
|
|
260
|
-
self.filter_list.setStatusTip(f"All available setups in {self._data_conf_location} "
|
|
261
|
-
f"that meet the filter condition(s).")
|
|
262
|
-
|
|
263
|
-
return widget
|
|
264
|
-
|
|
265
|
-
def make_tabbed_widget(self):
|
|
266
|
-
|
|
267
|
-
self.tabbed_widget.setTabsClosable(True)
|
|
268
|
-
self.tabbed_widget.tabCloseRequested.connect(self.close_tab)
|
|
269
|
-
self.tabbed_widget.setMovable(False)
|
|
270
|
-
self.tabbed_widget.setDocumentMode(True)
|
|
271
|
-
self.tabbed_widget.setElideMode(Qt.ElideRight)
|
|
272
|
-
self.tabbed_widget.setUsesScrollButtons(True)
|
|
273
|
-
|
|
274
|
-
# Make sure it is clear which tab is currently selected
|
|
275
|
-
|
|
276
|
-
self.tabbed_widget.setStyleSheet(
|
|
277
|
-
"""QTabBar::tab:selected{background: gray}""")
|
|
278
|
-
|
|
279
|
-
def close_tab(self, current_index):
|
|
280
|
-
""" Close the tab with the given index. """
|
|
281
|
-
|
|
282
|
-
current_widget = self.tabbed_widget.widget(current_index)
|
|
283
|
-
|
|
284
|
-
# Remember that the tab has been closed
|
|
285
|
-
|
|
286
|
-
self.open_tabs.remove(current_widget.accessibleName())
|
|
287
|
-
|
|
288
|
-
current_widget.deleteLater()
|
|
289
|
-
self.tabbed_widget.removeTab(current_index)
|
|
290
|
-
|
|
291
|
-
def clear_filter(self):
|
|
292
|
-
""" Clear the filter.
|
|
293
|
-
|
|
294
|
-
The following actions are taken:
|
|
295
|
-
- the text field with the filter is cleared;
|
|
296
|
-
- the list needs to be updated (it should show all available setups again);
|
|
297
|
-
- the tabs are cleared.
|
|
298
|
-
"""
|
|
299
|
-
|
|
300
|
-
# Clear filter
|
|
301
|
-
|
|
302
|
-
self.filter.setText("")
|
|
303
|
-
self.filter.repaint()
|
|
304
|
-
|
|
305
|
-
# Clear + re-build combobox
|
|
306
|
-
|
|
307
|
-
self.filter_list.clear()
|
|
308
|
-
self.update_list()
|
|
309
|
-
self.filter_list.repaint()
|
|
310
|
-
|
|
311
|
-
# Clear tabs
|
|
312
|
-
|
|
313
|
-
self.clear_tabs()
|
|
314
|
-
|
|
315
|
-
def clear_tabs(self):
|
|
316
|
-
""" Clear the tabs.
|
|
317
|
-
|
|
318
|
-
Clear the tabs on the right-hand side and clear the list of setups for which a tab was opened already.
|
|
319
|
-
"""
|
|
320
|
-
|
|
321
|
-
self.tabbed_widget.clear()
|
|
322
|
-
|
|
323
|
-
# Remember that all tabs were closed
|
|
324
|
-
|
|
325
|
-
self.open_tabs.clear()
|
|
326
|
-
|
|
327
|
-
def apply_filter(self):
|
|
328
|
-
""" Apply the filter.
|
|
329
|
-
|
|
330
|
-
The following actions are taken:
|
|
331
|
-
- the list needs to be updated (it should only contain the setups that pass the filtering);
|
|
332
|
-
- the tabs are closed.
|
|
333
|
-
"""
|
|
334
|
-
|
|
335
|
-
# Clear + re-build combobox
|
|
336
|
-
|
|
337
|
-
self.filter_list.clear()
|
|
338
|
-
self.update_list()
|
|
339
|
-
|
|
340
|
-
# Clear tabs
|
|
341
|
-
|
|
342
|
-
self.clear_tabs()
|
|
343
|
-
|
|
344
|
-
def update_list(self):
|
|
345
|
-
|
|
346
|
-
self.filter_list.addItem(None)
|
|
347
|
-
|
|
348
|
-
try:
|
|
349
|
-
|
|
350
|
-
filter_dict = self.get_filter_dict()
|
|
351
|
-
|
|
352
|
-
try:
|
|
353
|
-
|
|
354
|
-
with ConfigurationManagerProxy() as cm:
|
|
355
|
-
|
|
356
|
-
setup_overview = cm.list_setups(**filter_dict)
|
|
357
|
-
|
|
358
|
-
for setup_id, setup_site, description, cam_id in setup_overview:
|
|
359
|
-
self.filter_list.addItem(f"{setup_site} {setup_id} {cam_id} – {description}")
|
|
360
|
-
|
|
361
|
-
except ConnectionError:
|
|
362
|
-
|
|
363
|
-
description = "Connection with Configuration Manager was lost."
|
|
364
|
-
info_text = "Check the status of the core services (and re-start when necessary)"
|
|
365
|
-
show_warning_message(description, info_text=info_text)
|
|
366
|
-
|
|
367
|
-
except ValueError:
|
|
368
|
-
|
|
369
|
-
description = "Invalid filter text"
|
|
370
|
-
|
|
371
|
-
into_text = (
|
|
372
|
-
"When using multiple filtering conditions, they should be comma-separated. \n"
|
|
373
|
-
"Individual filtering conditions should follow the pattern key = value, where `key` should "
|
|
374
|
-
"match the dot notation from the setup file (e.g. gse.hexapod.ID = 2)."
|
|
375
|
-
)
|
|
376
|
-
|
|
377
|
-
show_warning_message(description, into_text)
|
|
378
|
-
|
|
379
|
-
def get_filter_dict(self):
|
|
380
|
-
""" Convert the content of the filter text field to a dictionary.
|
|
381
|
-
"""
|
|
382
|
-
|
|
383
|
-
filter_text = self.filter.text()
|
|
384
|
-
filter_text = ''.join(filter_text.split()) # Get rid of any blanks
|
|
385
|
-
|
|
386
|
-
# No filter was applied
|
|
387
|
-
# Return an empty dictionary
|
|
388
|
-
|
|
389
|
-
if filter_text == "":
|
|
390
|
-
|
|
391
|
-
return {}
|
|
392
|
-
|
|
393
|
-
else:
|
|
394
|
-
|
|
395
|
-
# Split by search term (comma-separated)
|
|
396
|
-
|
|
397
|
-
filter_dict = dict(e.split('=') for e in filter_text.split(', '))
|
|
398
|
-
|
|
399
|
-
for key, value in filter_dict.items():
|
|
400
|
-
|
|
401
|
-
try:
|
|
402
|
-
|
|
403
|
-
# Integer should be integers (not strings)
|
|
404
|
-
|
|
405
|
-
filter_dict[key] = int(value)
|
|
406
|
-
|
|
407
|
-
except ValueError:
|
|
408
|
-
|
|
409
|
-
# Get rid of the quotes
|
|
410
|
-
|
|
411
|
-
filter_dict[key] = value[1:-1]
|
|
412
|
-
|
|
413
|
-
# Allow for dot-navigation
|
|
414
|
-
|
|
415
|
-
key.replace(".", "__")
|
|
416
|
-
|
|
417
|
-
return filter_dict
|
|
418
|
-
|
|
419
|
-
def view_setup(self, value: str):
|
|
420
|
-
""" Show the setup that was selected in the drop-down menu, in a tab.
|
|
421
|
-
|
|
422
|
-
Args:
|
|
423
|
-
- value: Selected value from the drop-down menu, which contains the site and setup identifier.
|
|
424
|
-
"""
|
|
425
|
-
|
|
426
|
-
if value != "":
|
|
427
|
-
|
|
428
|
-
site, setup_id, _ = value.split(" ", 2)
|
|
429
|
-
|
|
430
|
-
# Tab already open
|
|
431
|
-
|
|
432
|
-
if (site + " " + setup_id) in self.open_tabs:
|
|
433
|
-
|
|
434
|
-
return
|
|
435
|
-
|
|
436
|
-
self.open_setup_tab(setup_id, site)
|
|
437
|
-
|
|
438
|
-
def open_setup_tab(self, setup_id, setup_site):
|
|
439
|
-
""" Show the setup file with the given filename in a tab.
|
|
440
|
-
|
|
441
|
-
Args:
|
|
442
|
-
- filename: Filename of the setup to show in a tab.
|
|
443
|
-
"""
|
|
444
|
-
|
|
445
|
-
setup_tab = QGroupBox()
|
|
446
|
-
layout = QVBoxLayout()
|
|
447
|
-
setup_tab.setLayout(layout)
|
|
448
|
-
|
|
449
|
-
# Setup
|
|
450
|
-
|
|
451
|
-
setup_text = QTextBrowser()
|
|
452
|
-
|
|
453
|
-
with ConfigurationManagerProxy() as cm:
|
|
454
|
-
setup = cm.get_setup(setup_id=int(setup_id))
|
|
455
|
-
|
|
456
|
-
console = Console(width=120, force_terminal=False, force_jupyter=False)
|
|
457
|
-
with console.capture() as capture:
|
|
458
|
-
console.print(setup)
|
|
459
|
-
text = capture.get()
|
|
460
|
-
setup_text.setText(text)
|
|
461
|
-
|
|
462
|
-
# setup_text.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
|
|
463
|
-
# setup_text.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
|
|
464
|
-
|
|
465
|
-
layout.addWidget(setup_text)
|
|
466
|
-
|
|
467
|
-
tab_name = setup_site + " " + setup_id
|
|
468
|
-
setup_tab.setAccessibleName(tab_name)
|
|
469
|
-
# setup_tab.setStatusTip(f"Setup for {filename}.")
|
|
470
|
-
self.tabbed_widget.addTab(setup_tab, tab_name)
|
|
471
|
-
|
|
472
|
-
# Bring the new tab into focus
|
|
473
|
-
|
|
474
|
-
self.tabbed_widget.setCurrentIndex(self.tabbed_widget.count() - 1)
|
|
475
|
-
|
|
476
|
-
# Remember that a tab was opened for this setup
|
|
477
|
-
|
|
478
|
-
self.open_tabs.append(tab_name)
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
# class SetupUIModel:
|
|
482
|
-
#
|
|
483
|
-
# def __init__(self):
|
|
484
|
-
# """ Initialisation of the Process Manager UI model."""
|
|
485
|
-
#
|
|
486
|
-
# try:
|
|
487
|
-
#
|
|
488
|
-
# self.configuration_manager = ConfigurationManagerProxy()
|
|
489
|
-
#
|
|
490
|
-
# except ConnectionError:
|
|
491
|
-
#
|
|
492
|
-
# self.configuration_manager = None
|
|
493
|
-
#
|
|
494
|
-
# def is_connected(self):
|
|
495
|
-
# """ Checks whether the Process Manager Control Server is active.
|
|
496
|
-
#
|
|
497
|
-
# Checks whether a connection to the Process Manager Control Server has been established.
|
|
498
|
-
#
|
|
499
|
-
# Returns:
|
|
500
|
-
# - True if a connection to the Process Manager Control Server has been established; False otherwise.
|
|
501
|
-
# """
|
|
502
|
-
#
|
|
503
|
-
# return self.configuration_manager.ping() and self.configuration_manager.is_cs_connected()
|
|
504
|
-
#
|
|
505
|
-
#
|
|
506
|
-
# class SetupUIController:
|
|
507
|
-
#
|
|
508
|
-
# def __init__(self, model: SetupUIModel,
|
|
509
|
-
# view: SetupUIView):
|
|
510
|
-
# """ Initialisation of the Controller for the Process Manager GUI.
|
|
511
|
-
# Args:
|
|
512
|
-
# - model: Process Manager UI model.
|
|
513
|
-
# - view: Process Manager UI view.
|
|
514
|
-
# """
|
|
515
|
-
#
|
|
516
|
-
# self.model = model
|
|
517
|
-
# self.view = view
|
|
518
|
-
#
|
|
519
|
-
#
|
|
520
|
-
#
|
|
521
|
-
# def update(self, changed_object):
|
|
522
|
-
# """ Define button press actions for the toolbar.
|
|
523
|
-
# Define which actions should be taken when which button (in the toolbar)
|
|
524
|
-
# is pressed in the Process Manager GUI. The following button are
|
|
525
|
-
# available:
|
|
526
|
-
# - starting all device Control Servers in the current setup;
|
|
527
|
-
# - shutting down all device Control Servers in the current setup;
|
|
528
|
-
# - showing pop-up window with an explanation about the process
|
|
529
|
-
# status.
|
|
530
|
-
# """
|
|
531
|
-
#
|
|
532
|
-
# pass
|
|
533
|
-
#
|
|
534
|
-
# def do(self):
|
|
535
|
-
# pass
|
|
536
|
-
#
|
|
537
|
-
|
|
538
|
-
def main():
|
|
539
|
-
""" Main method to launch the Setup GUI."""
|
|
540
|
-
lock_file = QLockFile(str(Path("~/setup_ui.app.lock").expanduser()))
|
|
541
|
-
|
|
542
|
-
app = QApplication(sys.argv)
|
|
543
|
-
app.setWindowIcon(QIcon(str(get_resource(":/icons/settings.svg"))))
|
|
544
|
-
|
|
545
|
-
if lock_file.tryLock(100):
|
|
546
|
-
# Check whether the Process Manager CS is running
|
|
547
|
-
# (show a warning in a pop-up window if it's not)
|
|
548
|
-
|
|
549
|
-
view = SetupUIView()
|
|
550
|
-
|
|
551
|
-
view.show()
|
|
552
|
-
|
|
553
|
-
return app.exec_()
|
|
554
|
-
else:
|
|
555
|
-
error_message = QMessageBox()
|
|
556
|
-
error_message.setIcon(QMessageBox.Warning)
|
|
557
|
-
error_message.setWindowTitle("Error")
|
|
558
|
-
error_message.setText("The setup GUI application is already running!")
|
|
559
|
-
error_message.setStandardButtons(QMessageBox.Ok)
|
|
560
|
-
|
|
561
|
-
return error_message.exec()
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
if __name__ == '__main__':
|
|
565
|
-
sys.exit(main())
|