cgse 2024.7.0__py3-none-any.whl → 2025.0.1__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.1.dist-info/METADATA +38 -0
- cgse-2025.0.1.dist-info/RECORD +5 -0
- {cgse-2024.7.0.dist-info → cgse-2025.0.1.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/tcs/tcs_ui.py
DELETED
|
@@ -1,543 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
A simple GUI which allows to inspect the TCS EGSE configuration and housekeeping.
|
|
3
|
-
|
|
4
|
-
The GUI window consists of a tabbed view with two tabs.
|
|
5
|
-
|
|
6
|
-
The Configuration tab shows the configuration at the time the GUI was started or the tab was
|
|
7
|
-
reloaded. The Housekeeping tab shows all the housekeeping values. Whenever a tabs is selected,
|
|
8
|
-
the content is refreshed.
|
|
9
|
-
|
|
10
|
-
!!! note
|
|
11
|
-
If you want to use the Configuration tab or the Housekeeping tab, the TCS EGSE must be in
|
|
12
|
-
Remote Control mode. Use the remote control button in the toolbar.
|
|
13
|
-
|
|
14
|
-
"""
|
|
15
|
-
import logging
|
|
16
|
-
import multiprocessing
|
|
17
|
-
from pathlib import Path
|
|
18
|
-
|
|
19
|
-
import sys
|
|
20
|
-
import warnings
|
|
21
|
-
from collections import namedtuple
|
|
22
|
-
from enum import Enum
|
|
23
|
-
|
|
24
|
-
multiprocessing.current_process().name = "tcs_ui"
|
|
25
|
-
|
|
26
|
-
from PyQt5 import QtWidgets
|
|
27
|
-
from PyQt5.QtCore import QTimer, QLockFile
|
|
28
|
-
from PyQt5.QtCore import Qt
|
|
29
|
-
from PyQt5.QtGui import QFont
|
|
30
|
-
from PyQt5.QtGui import QIcon
|
|
31
|
-
from PyQt5.QtWidgets import QMainWindow, QMessageBox
|
|
32
|
-
from PyQt5.QtWidgets import QScrollArea
|
|
33
|
-
from PyQt5.QtWidgets import QSizePolicy
|
|
34
|
-
from PyQt5.QtWidgets import QStatusBar
|
|
35
|
-
from PyQt5.QtWidgets import QTabWidget
|
|
36
|
-
from PyQt5.QtWidgets import QTextEdit
|
|
37
|
-
from PyQt5.QtWidgets import QToolBar
|
|
38
|
-
from PyQt5.QtWidgets import QVBoxLayout
|
|
39
|
-
from PyQt5.QtWidgets import QWidget
|
|
40
|
-
from rich.console import Console
|
|
41
|
-
from rich.table import Table
|
|
42
|
-
|
|
43
|
-
from egse.control import Failure
|
|
44
|
-
from egse.gui.buttons import ToggleButton
|
|
45
|
-
from egse.gui.buttons import TouchButton
|
|
46
|
-
from egse.observer import Observable
|
|
47
|
-
from egse.observer import Observer
|
|
48
|
-
from egse.resource import get_resource
|
|
49
|
-
from egse.tcs.tcs import TCSProxy
|
|
50
|
-
from egse.tcs.tcs import is_tcs_cs_active
|
|
51
|
-
|
|
52
|
-
MODULE_LOGGER = logging.getLogger(__name__)
|
|
53
|
-
|
|
54
|
-
CONFIGURATION_TAB = "Configuration"
|
|
55
|
-
HOUSEKEEPING_TAB = "Housekeeping"
|
|
56
|
-
|
|
57
|
-
ScrollableTextBox = namedtuple("ScrollableTextBox", ["scroll", "text_box"])
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
class Actions(Enum):
|
|
61
|
-
REFRESH_TAB = "refresh-tab"
|
|
62
|
-
CLEAR_POPUP = "clear-popup"
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
class TCSUIModel:
|
|
66
|
-
def __init__(self):
|
|
67
|
-
super().__init__()
|
|
68
|
-
|
|
69
|
-
# FIXME: shall we do some checking for exceptions here?
|
|
70
|
-
self.device = TCSProxy()
|
|
71
|
-
|
|
72
|
-
def read_configuration(self) -> dict:
|
|
73
|
-
return self.device.get_configuration()
|
|
74
|
-
|
|
75
|
-
def read_all_housekeeping(self):
|
|
76
|
-
return self.device.get_all_housekeeping()
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
class TCSUIView(QMainWindow, Observable):
|
|
80
|
-
|
|
81
|
-
def __init__(self):
|
|
82
|
-
super().__init__()
|
|
83
|
-
|
|
84
|
-
self.setGeometry(600, 100, 1000, 900)
|
|
85
|
-
self.setWindowTitle('TCS EGSE Viewer')
|
|
86
|
-
|
|
87
|
-
self.setStatusBar(QStatusBar(self))
|
|
88
|
-
self.status = self.statusBar()
|
|
89
|
-
|
|
90
|
-
# Instance variables defined and used in the create methods below
|
|
91
|
-
|
|
92
|
-
self.cs_connection = None
|
|
93
|
-
self.device_connection = None
|
|
94
|
-
self.start_task_button = None
|
|
95
|
-
self.remote_control_button = None
|
|
96
|
-
self.reload_button = None
|
|
97
|
-
self.clear_button = None
|
|
98
|
-
self.toolbar = None
|
|
99
|
-
|
|
100
|
-
self.text_tabs = {
|
|
101
|
-
CONFIGURATION_TAB: self.create_scrollable_text_box(CONFIGURATION_TAB),
|
|
102
|
-
HOUSEKEEPING_TAB: self.create_scrollable_text_box(HOUSEKEEPING_TAB)
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
self.tabs = QTabWidget()
|
|
106
|
-
self.tabs.setDocumentMode(False)
|
|
107
|
-
|
|
108
|
-
# self.tabs.currentChanged.connect(self.on_current_tab_changed)
|
|
109
|
-
self.tabs.tabBarClicked.connect(self.on_current_tab_changed)
|
|
110
|
-
|
|
111
|
-
self.tabs.addTab(self.text_tabs[CONFIGURATION_TAB].scroll, CONFIGURATION_TAB)
|
|
112
|
-
self.tabs.addTab(self.text_tabs[HOUSEKEEPING_TAB].scroll, HOUSEKEEPING_TAB)
|
|
113
|
-
|
|
114
|
-
self.setCentralWidget(self.tabs)
|
|
115
|
-
|
|
116
|
-
self.create_toolbar()
|
|
117
|
-
|
|
118
|
-
def create_toolbar(self):
|
|
119
|
-
|
|
120
|
-
icon_width = icon_height = 42
|
|
121
|
-
|
|
122
|
-
# Struct is used to add some fixed spacing between the icons
|
|
123
|
-
|
|
124
|
-
strut = QWidget()
|
|
125
|
-
strut.setFixedSize(5, 5)
|
|
126
|
-
|
|
127
|
-
# spacer widget to help with aligning some buttons to the right
|
|
128
|
-
|
|
129
|
-
spacer = QWidget()
|
|
130
|
-
spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
|
|
131
|
-
|
|
132
|
-
# The Reconnect action is used to reconnect to the control server
|
|
133
|
-
|
|
134
|
-
self.cs_connection = ToggleButton(
|
|
135
|
-
name="CS-CONNECT",
|
|
136
|
-
width=icon_width, height=icon_height,
|
|
137
|
-
status_tip="connect-disconnect TCS EGSE control server.",
|
|
138
|
-
selected=get_resource(":/icons/cs-connected.svg"),
|
|
139
|
-
not_selected=get_resource(":/icons/cs-not-connected.svg"),
|
|
140
|
-
disabled=get_resource(":/icons/cs-connected-disabled.svg")
|
|
141
|
-
)
|
|
142
|
-
self.cs_connection.clicked.connect(self.on_cs_connection_button_click)
|
|
143
|
-
|
|
144
|
-
# The Reconnect action is used to reconnect the device
|
|
145
|
-
|
|
146
|
-
self.device_connection = ToggleButton(
|
|
147
|
-
name="DEVICE-CONNECT",
|
|
148
|
-
width=icon_width, height=icon_height,
|
|
149
|
-
status_tip="connect-disconnect the TCS EGSE device controller",
|
|
150
|
-
selected=get_resource(":/icons/plugged.svg"),
|
|
151
|
-
not_selected=get_resource(":/icons/unplugged.svg"),
|
|
152
|
-
disabled=get_resource(":/icons/plugged-disabled.svg")
|
|
153
|
-
)
|
|
154
|
-
self.device_connection.clicked.connect(self.on_device_connection_button_click)
|
|
155
|
-
|
|
156
|
-
with TCSProxy() as tcs:
|
|
157
|
-
|
|
158
|
-
self.start_task_button = ToggleButton(
|
|
159
|
-
name="START-TASK",
|
|
160
|
-
width=icon_width, height=icon_height,
|
|
161
|
-
status_tip="Start/stop task on the TCS EGSE.",
|
|
162
|
-
selected=get_resource(":/icons/start-button.svg"),
|
|
163
|
-
not_selected=get_resource(":/icons/stop-button.svg"),
|
|
164
|
-
disabled=[
|
|
165
|
-
get_resource(":/icons/start-button-disabled.svg"),
|
|
166
|
-
get_resource(":/icons/stop-button-disabled.svg"),
|
|
167
|
-
]
|
|
168
|
-
)
|
|
169
|
-
self.start_task_button.clicked.connect(self.on_start_task_button_click)
|
|
170
|
-
if isinstance(task_is_running := tcs.is_task_running(), Failure):
|
|
171
|
-
self.start_task_button.disable()
|
|
172
|
-
else:
|
|
173
|
-
self.start_task_button.set_selected(not task_is_running)
|
|
174
|
-
|
|
175
|
-
self.remote_control_button = ToggleButton(
|
|
176
|
-
name="REMOTE-CONTROL",
|
|
177
|
-
width=icon_width, height=icon_height,
|
|
178
|
-
status_tip="(de-)Activate remote control on the TCS EGSE.",
|
|
179
|
-
selected=get_resource(":/icons/remote-control-on.svg"),
|
|
180
|
-
not_selected=get_resource(":/icons/remote-control-off.svg"),
|
|
181
|
-
)
|
|
182
|
-
self.remote_control_button.clicked.connect(self.on_remote_control_button_click)
|
|
183
|
-
self.remote_control_button.set_selected(tcs.is_remote_operation_active())
|
|
184
|
-
|
|
185
|
-
self.reload_button = TouchButton(
|
|
186
|
-
name="RELOAD-TELEMETRY",
|
|
187
|
-
width=32, height=32,
|
|
188
|
-
status_tip="Reload the current view: Configuration or Housekeeping.",
|
|
189
|
-
selected=get_resource(":/icons/repeat-blue.svg"),
|
|
190
|
-
)
|
|
191
|
-
self.reload_button.clicked.connect(self.on_reload_button_click)
|
|
192
|
-
|
|
193
|
-
self.clear_button = TouchButton(
|
|
194
|
-
name="CLEAR-MMI-ERROR",
|
|
195
|
-
width=icon_width, height=icon_height,
|
|
196
|
-
status_tip="Clear the red box error message on the MMI.",
|
|
197
|
-
selected=get_resource(":/icons/cleaning.svg"),
|
|
198
|
-
)
|
|
199
|
-
self.clear_button.clicked.connect(self.on_clear_button_click)
|
|
200
|
-
|
|
201
|
-
self.toolbar = QToolBar("Main Toolbar")
|
|
202
|
-
self.toolbar.addWidget(self.device_connection)
|
|
203
|
-
self.toolbar.addWidget(self.cs_connection)
|
|
204
|
-
self.toolbar.addSeparator()
|
|
205
|
-
self.toolbar.addWidget(self.start_task_button)
|
|
206
|
-
self.toolbar.addWidget(strut)
|
|
207
|
-
self.toolbar.addWidget(self.remote_control_button)
|
|
208
|
-
self.toolbar.addWidget(strut)
|
|
209
|
-
self.toolbar.addWidget(self.reload_button)
|
|
210
|
-
self.toolbar.addWidget(spacer)
|
|
211
|
-
self.toolbar.addWidget(self.clear_button)
|
|
212
|
-
|
|
213
|
-
self.toolbar.setStyleSheet("padding: 5px;")
|
|
214
|
-
|
|
215
|
-
# self.toolbar.setStyleSheet("padding-top: 10px; "
|
|
216
|
-
# "padding-bottom: 10px;")
|
|
217
|
-
|
|
218
|
-
self.addToolBar(self.toolbar)
|
|
219
|
-
|
|
220
|
-
def on_current_tab_changed(self, tab_nr):
|
|
221
|
-
if tab_nr == -1:
|
|
222
|
-
return
|
|
223
|
-
tab_name = self.tabs.tabText(tab_nr)
|
|
224
|
-
self.actionObservers({Actions.REFRESH_TAB: (tab_nr, tab_name)})
|
|
225
|
-
|
|
226
|
-
def on_cs_connection_button_click(self):
|
|
227
|
-
MODULE_LOGGER.info("Control Server connection button clicked, not yet implemented.")
|
|
228
|
-
|
|
229
|
-
def on_device_connection_button_click(self):
|
|
230
|
-
MODULE_LOGGER.info("Device connection button clicked, not yet implemented.")
|
|
231
|
-
|
|
232
|
-
def on_clear_button_click(self):
|
|
233
|
-
|
|
234
|
-
self.actionObservers({Actions.CLEAR_POPUP: None})
|
|
235
|
-
|
|
236
|
-
def on_reload_button_click(self):
|
|
237
|
-
"""Update the view in the currently selected TAB."""
|
|
238
|
-
|
|
239
|
-
tab_nr = self.tabs.currentIndex()
|
|
240
|
-
tab_name = self.tabs.tabText(tab_nr)
|
|
241
|
-
|
|
242
|
-
self.actionObservers({Actions.REFRESH_TAB: (tab_nr, tab_name)})
|
|
243
|
-
|
|
244
|
-
def on_remote_control_button_click(self):
|
|
245
|
-
|
|
246
|
-
if not is_tcs_cs_active():
|
|
247
|
-
self.status.showMessage(
|
|
248
|
-
"TCS EGSE Control Server is not active, check if the `tcs_cs` is running.",
|
|
249
|
-
msecs=5000
|
|
250
|
-
)
|
|
251
|
-
return
|
|
252
|
-
|
|
253
|
-
with TCSProxy() as tcs:
|
|
254
|
-
if tcs.is_remote_operation_active():
|
|
255
|
-
response = tcs.quit_remote_operation()
|
|
256
|
-
self.remote_control_button.set_selected(False)
|
|
257
|
-
self.start_task_button.disable()
|
|
258
|
-
else:
|
|
259
|
-
response = tcs.request_remote_operation()
|
|
260
|
-
self.remote_control_button.set_selected(True)
|
|
261
|
-
self.start_task_button.enable()
|
|
262
|
-
|
|
263
|
-
def on_start_task_button_click(self):
|
|
264
|
-
"""Start / stop a task on the TCS EGSE.
|
|
265
|
-
This is equivalent to pressing the Start/Stop button on the touch screen of the TCS EGSE.
|
|
266
|
-
The device must be in remote control mode.
|
|
267
|
-
"""
|
|
268
|
-
|
|
269
|
-
if not is_tcs_cs_active():
|
|
270
|
-
self.status.showMessage(
|
|
271
|
-
"TCS EGSE Control Server is not active, check if the `tcs_cs` is running.",
|
|
272
|
-
msecs=5000
|
|
273
|
-
)
|
|
274
|
-
return
|
|
275
|
-
|
|
276
|
-
with TCSProxy() as tcs:
|
|
277
|
-
if not tcs.is_remote_operation_active():
|
|
278
|
-
self.start_task_button.disable()
|
|
279
|
-
self.status.showMessage(
|
|
280
|
-
"TCS EGSE is not in remote control mode, press the remote control button.",
|
|
281
|
-
msecs=5000
|
|
282
|
-
)
|
|
283
|
-
return
|
|
284
|
-
|
|
285
|
-
if tcs.is_task_running():
|
|
286
|
-
response = tcs.stop_task()
|
|
287
|
-
# MODULE_LOGGER.info(f"stop_task: {response=}")
|
|
288
|
-
self.start_task_button.set_selected(True)
|
|
289
|
-
else:
|
|
290
|
-
response = tcs.run_task()
|
|
291
|
-
# MODULE_LOGGER.info(f"run_task: {response=}")
|
|
292
|
-
self.start_task_button.set_selected(False)
|
|
293
|
-
|
|
294
|
-
# TODO: should this function move into egse.gui?
|
|
295
|
-
|
|
296
|
-
def create_scrollable_text_box(self, name: str) -> ScrollableTextBox:
|
|
297
|
-
scroll = QScrollArea()
|
|
298
|
-
scroll.setObjectName(name)
|
|
299
|
-
widget = QWidget()
|
|
300
|
-
vbox = QVBoxLayout()
|
|
301
|
-
|
|
302
|
-
text_box: QTextEdit = QTextEdit()
|
|
303
|
-
text_box.setReadOnly(True)
|
|
304
|
-
monospaced_font = QFont("Courier New")
|
|
305
|
-
monospaced_font.setStyleHint(QFont.Monospace)
|
|
306
|
-
text_box.setFont(monospaced_font)
|
|
307
|
-
text_box.setLineWrapMode(QTextEdit.NoWrap)
|
|
308
|
-
vbox.addWidget(text_box)
|
|
309
|
-
|
|
310
|
-
widget.setLayout(vbox)
|
|
311
|
-
|
|
312
|
-
scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
|
|
313
|
-
scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
|
|
314
|
-
scroll.setWidgetResizable(True)
|
|
315
|
-
scroll.setWidget(widget)
|
|
316
|
-
|
|
317
|
-
return ScrollableTextBox(scroll, text_box)
|
|
318
|
-
|
|
319
|
-
def get_tab_nr(self, tab_name: str) -> int:
|
|
320
|
-
"""Find the index for the TAB with the given name."""
|
|
321
|
-
for index in range(self.tabs.count()):
|
|
322
|
-
if tab_name == self.tabs.tabText(index):
|
|
323
|
-
return index
|
|
324
|
-
|
|
325
|
-
def set_text_for_tab(self, tab_id: str, text: str, preserve_scroll: bool = True):
|
|
326
|
-
"""Set the text in the TAB with tab_id. The TAB is expected to be a ScrollableTextBox.
|
|
327
|
-
|
|
328
|
-
Args:
|
|
329
|
-
tab_id: the identification for the TAB. This is the name of the TAB.
|
|
330
|
-
text: the replacement text to be shown in the TAB
|
|
331
|
-
preserve_scroll: show the test from the start or preserve the current scroll position
|
|
332
|
-
"""
|
|
333
|
-
|
|
334
|
-
widget: ScrollableTextBox = self.text_tabs[tab_id]
|
|
335
|
-
text_box: QTextEdit = widget.text_box
|
|
336
|
-
|
|
337
|
-
if preserve_scroll:
|
|
338
|
-
vsb = text_box.verticalScrollBar()
|
|
339
|
-
old_pos_ratio = vsb.value() / (vsb.maximum() or 1)
|
|
340
|
-
|
|
341
|
-
text_box.setText(text)
|
|
342
|
-
|
|
343
|
-
vsb.setValue(round(old_pos_ratio * vsb.maximum()))
|
|
344
|
-
else:
|
|
345
|
-
text_box.setText(text)
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
class TCSUIController(Observer):
|
|
349
|
-
def __init__(self, model: TCSUIModel, view: TCSUIView):
|
|
350
|
-
super().__init__()
|
|
351
|
-
self._model = model
|
|
352
|
-
self._view = view
|
|
353
|
-
self._view.addObserver(self)
|
|
354
|
-
|
|
355
|
-
self.hk_capture_timer = None
|
|
356
|
-
self.remote_button_update_timer = None
|
|
357
|
-
|
|
358
|
-
self.update_housekeeping_view()
|
|
359
|
-
self.update_configuration_view()
|
|
360
|
-
|
|
361
|
-
self.create_timer()
|
|
362
|
-
|
|
363
|
-
def update(self, changed_object):
|
|
364
|
-
pass
|
|
365
|
-
|
|
366
|
-
def do(self, actions):
|
|
367
|
-
|
|
368
|
-
for action, value in actions.items():
|
|
369
|
-
# MODULE_LOGGER.info(f"Action requested: do {action} with {value=}")
|
|
370
|
-
if action == Actions.REFRESH_TAB:
|
|
371
|
-
self.do_refresh_tab(tab_nr=value[0], tab_name=value[1])
|
|
372
|
-
elif action == Actions.CLEAR_POPUP:
|
|
373
|
-
self.do_clear_popup()
|
|
374
|
-
|
|
375
|
-
def do_refresh_tab(self, tab_nr: int, tab_name: str):
|
|
376
|
-
if tab_name == CONFIGURATION_TAB:
|
|
377
|
-
self.update_configuration_view()
|
|
378
|
-
self.stop_timer()
|
|
379
|
-
elif tab_name == HOUSEKEEPING_TAB:
|
|
380
|
-
self.update_housekeeping_view()
|
|
381
|
-
self.start_timer()
|
|
382
|
-
else:
|
|
383
|
-
warnings.warn(
|
|
384
|
-
f"Unknown TAB name passed into the refresh method in the UI Controller {tab_name}.")
|
|
385
|
-
|
|
386
|
-
def do_clear_popup(self):
|
|
387
|
-
if not is_tcs_cs_active():
|
|
388
|
-
return
|
|
389
|
-
|
|
390
|
-
with TCSProxy() as tcs:
|
|
391
|
-
if tcs.is_remote_operation_active():
|
|
392
|
-
tcs.clear_popup()
|
|
393
|
-
|
|
394
|
-
self._view.status.showMessage("Popup has been cleared on MMI.", 2000)
|
|
395
|
-
|
|
396
|
-
def update_configuration_view(self):
|
|
397
|
-
|
|
398
|
-
if not is_tcs_cs_active():
|
|
399
|
-
self._view.set_text_for_tab(
|
|
400
|
-
CONFIGURATION_TAB,
|
|
401
|
-
"TCS EGSE Control Server is not active, check if the `tcs_cs` is running."
|
|
402
|
-
)
|
|
403
|
-
return
|
|
404
|
-
|
|
405
|
-
tcs_conf = self._model.read_configuration()
|
|
406
|
-
|
|
407
|
-
if isinstance(tcs_conf, Failure):
|
|
408
|
-
self._view.set_text_for_tab(
|
|
409
|
-
CONFIGURATION_TAB,
|
|
410
|
-
"Could not retrieve the configuration of the TCS EGSE.\n"
|
|
411
|
-
"Check if the TCS EGSE is in Remote Control mode."
|
|
412
|
-
)
|
|
413
|
-
return
|
|
414
|
-
|
|
415
|
-
table = Table(title="Configuration Parameters")
|
|
416
|
-
|
|
417
|
-
table.add_column("Name", justify="left", style="cyan", no_wrap=True)
|
|
418
|
-
table.add_column("Value", justify="right", style="green")
|
|
419
|
-
|
|
420
|
-
for name, value in sorted(tcs_conf.items()):
|
|
421
|
-
table.add_row(name, value)
|
|
422
|
-
|
|
423
|
-
console = Console(force_terminal=False, force_jupyter=False)
|
|
424
|
-
with console.capture() as capture:
|
|
425
|
-
console.print(table)
|
|
426
|
-
text = capture.get()
|
|
427
|
-
|
|
428
|
-
self._view.set_text_for_tab(CONFIGURATION_TAB, text, preserve_scroll=True)
|
|
429
|
-
|
|
430
|
-
def update_housekeeping_view(self):
|
|
431
|
-
|
|
432
|
-
if not is_tcs_cs_active():
|
|
433
|
-
self._view.set_text_for_tab(
|
|
434
|
-
HOUSEKEEPING_TAB,
|
|
435
|
-
"TCS EGSE Control Server is not active, check if the `tcs_cs` is running."
|
|
436
|
-
)
|
|
437
|
-
return
|
|
438
|
-
|
|
439
|
-
all_hk = self._model.read_all_housekeeping()
|
|
440
|
-
|
|
441
|
-
if isinstance(all_hk, Failure):
|
|
442
|
-
logging.warning(f"Communication error: {all_hk}")
|
|
443
|
-
self._view.status.showMessage("Communication failure with TCS EGSE", 5000)
|
|
444
|
-
self._view.set_text_for_tab(
|
|
445
|
-
HOUSEKEEPING_TAB,
|
|
446
|
-
"Could not retrieve housekeeping from the TCS EGSE.\n"
|
|
447
|
-
"Check if the TCS EGSE is in Remote Control mode."
|
|
448
|
-
)
|
|
449
|
-
return
|
|
450
|
-
|
|
451
|
-
table = Table(title="All Housekeeping parameters", width=120)
|
|
452
|
-
|
|
453
|
-
table.add_column("Timestamp", justify="center", style="black", no_wrap=True)
|
|
454
|
-
table.add_column("Name", justify="left", style="cyan", no_wrap=True)
|
|
455
|
-
table.add_column("Value", justify="right", style="green", no_wrap=False)
|
|
456
|
-
|
|
457
|
-
for hk_entry in all_hk:
|
|
458
|
-
try:
|
|
459
|
-
table.add_row(hk_entry[0], hk_entry[1], hk_entry[2])
|
|
460
|
-
except IndexError:
|
|
461
|
-
# FIXME: view should have a method for this
|
|
462
|
-
self._view.status.showMessage('Incorrect format for housekeeping data', 2000)
|
|
463
|
-
logging.warning(f"Incorrect format for housekeeping data: {hk_entry=}")
|
|
464
|
-
|
|
465
|
-
console = Console(width=120, force_terminal=False, force_jupyter=False)
|
|
466
|
-
with console.capture() as capture:
|
|
467
|
-
console.print(table)
|
|
468
|
-
text = capture.get()
|
|
469
|
-
|
|
470
|
-
self._view.set_text_for_tab(HOUSEKEEPING_TAB, text, preserve_scroll=True)
|
|
471
|
-
|
|
472
|
-
def update_state_of_buttons(self):
|
|
473
|
-
|
|
474
|
-
if not is_tcs_cs_active():
|
|
475
|
-
return
|
|
476
|
-
|
|
477
|
-
with TCSProxy() as tcs:
|
|
478
|
-
self._view.remote_control_button.set_selected(tcs.is_remote_operation_active())
|
|
479
|
-
if tcs.is_remote_operation_active():
|
|
480
|
-
task_is_running = tcs.is_task_running()
|
|
481
|
-
if isinstance(task_is_running, Failure):
|
|
482
|
-
self._view.status.showMessage(task_is_running.message, 2000)
|
|
483
|
-
self._view.start_task_button.disable()
|
|
484
|
-
else:
|
|
485
|
-
self._view.start_task_button.enable()
|
|
486
|
-
self._view.start_task_button.set_selected(not task_is_running)
|
|
487
|
-
|
|
488
|
-
def create_timer(self):
|
|
489
|
-
"""Create a Timer that will update the Housekeeping every second."""
|
|
490
|
-
|
|
491
|
-
self.hk_capture_timer = QTimer()
|
|
492
|
-
|
|
493
|
-
self.hk_capture_timer.timeout.connect(self.update_housekeeping_view)
|
|
494
|
-
self.hk_capture_timer.setInterval(10000)
|
|
495
|
-
|
|
496
|
-
self.remote_button_update_timer = QTimer()
|
|
497
|
-
self.remote_button_update_timer.timeout.connect(self.update_state_of_buttons)
|
|
498
|
-
self.remote_button_update_timer.setInterval(500) #
|
|
499
|
-
self.remote_button_update_timer.start()
|
|
500
|
-
|
|
501
|
-
def start_timer(self):
|
|
502
|
-
self.hk_capture_timer.start()
|
|
503
|
-
|
|
504
|
-
def stop_timer(self):
|
|
505
|
-
self.hk_capture_timer.stop()
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
def main():
|
|
509
|
-
|
|
510
|
-
if not is_tcs_cs_active():
|
|
511
|
-
print("ERROR: TCS CS is not active, "
|
|
512
|
-
"start the TCS control server before launching this GUI.")
|
|
513
|
-
sys.exit(1)
|
|
514
|
-
|
|
515
|
-
lock_file = QLockFile(str(Path("~/tcs_ui.app.lock").expanduser()))
|
|
516
|
-
|
|
517
|
-
app_logo = get_resource(":/icons/logo-tcs.svg")
|
|
518
|
-
|
|
519
|
-
app = QtWidgets.QApplication(sys.argv)
|
|
520
|
-
app.setWindowIcon(QIcon(str(app_logo)))
|
|
521
|
-
|
|
522
|
-
if lock_file.tryLock(100):
|
|
523
|
-
|
|
524
|
-
view = TCSUIView()
|
|
525
|
-
model = TCSUIModel()
|
|
526
|
-
|
|
527
|
-
TCSUIController(model, view)
|
|
528
|
-
|
|
529
|
-
view.show()
|
|
530
|
-
|
|
531
|
-
return app.exec()
|
|
532
|
-
else:
|
|
533
|
-
error_message = QMessageBox()
|
|
534
|
-
error_message.setIcon(QMessageBox.Warning)
|
|
535
|
-
error_message.setWindowTitle("Error")
|
|
536
|
-
error_message.setText("The TCS GUI application is already running!")
|
|
537
|
-
error_message.setStandardButtons(QMessageBox.Ok)
|
|
538
|
-
|
|
539
|
-
return error_message.exec()
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
if __name__ == '__main__':
|
|
543
|
-
sys.exit(main())
|