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/collimator/fcul/ogse_ui.py
DELETED
|
@@ -1,1108 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import multiprocessing
|
|
3
|
-
import os
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
import sys
|
|
7
|
-
import threading
|
|
8
|
-
from typing import Optional
|
|
9
|
-
from typing import Tuple
|
|
10
|
-
from typing import Union
|
|
11
|
-
|
|
12
|
-
from PyQt5 import QtCore
|
|
13
|
-
from PyQt5.QtCore import QObject, QLockFile
|
|
14
|
-
from PyQt5.QtCore import QRunnable
|
|
15
|
-
from PyQt5.QtCore import QThreadPool
|
|
16
|
-
from PyQt5.QtCore import QTimer
|
|
17
|
-
from PyQt5.QtCore import pyqtSignal
|
|
18
|
-
from PyQt5.QtCore import pyqtSlot
|
|
19
|
-
from PyQt5.QtGui import QIcon
|
|
20
|
-
from PyQt5.QtWidgets import QAction
|
|
21
|
-
from PyQt5.QtWidgets import QApplication
|
|
22
|
-
from PyQt5.QtWidgets import QGridLayout
|
|
23
|
-
from PyQt5.QtWidgets import QGroupBox
|
|
24
|
-
from PyQt5.QtWidgets import QHBoxLayout
|
|
25
|
-
from PyQt5.QtWidgets import QLabel
|
|
26
|
-
from PyQt5.QtWidgets import QMainWindow
|
|
27
|
-
from PyQt5.QtWidgets import QMessageBox
|
|
28
|
-
from PyQt5.QtWidgets import QSizePolicy
|
|
29
|
-
from PyQt5.QtWidgets import QSlider
|
|
30
|
-
from PyQt5.QtWidgets import QStatusBar
|
|
31
|
-
from PyQt5.QtWidgets import QToolBar
|
|
32
|
-
from PyQt5.QtWidgets import QVBoxLayout
|
|
33
|
-
from PyQt5.QtWidgets import QWidget
|
|
34
|
-
from prometheus_client import start_http_server
|
|
35
|
-
from zmq import ZMQError
|
|
36
|
-
|
|
37
|
-
from egse.collimator.fcul.ogse import OGSEProxy
|
|
38
|
-
from egse.decorators import timer
|
|
39
|
-
from egse.gui import VLine
|
|
40
|
-
from egse.gui.buttons import BUTTON_SELECTED
|
|
41
|
-
from egse.gui.buttons import ToggleButton
|
|
42
|
-
from egse.gui.buttons import TouchButton
|
|
43
|
-
from egse.gui.led import Indic
|
|
44
|
-
from egse.gui.led import ShapeEnum
|
|
45
|
-
from egse.gui.states import States
|
|
46
|
-
from egse.help.help_ui import HELP_TOPICS
|
|
47
|
-
from egse.help.help_ui import HelpWindow
|
|
48
|
-
from egse.observer import Observable
|
|
49
|
-
from egse.observer import Observer
|
|
50
|
-
from egse.settings import Settings
|
|
51
|
-
from egse.state import UnknownStateError
|
|
52
|
-
|
|
53
|
-
multiprocessing.current_process().name = "ogse_ui"
|
|
54
|
-
|
|
55
|
-
from egse.process import ProcessStatus
|
|
56
|
-
from egse.resource import get_resource
|
|
57
|
-
from egse.system import do_every
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
MODULE_LOGGER = logging.getLogger("egse.collimator.fcul.ogse_ui")
|
|
61
|
-
|
|
62
|
-
GUI_SETTINGS = Settings.load("OGSE GUI")
|
|
63
|
-
|
|
64
|
-
TITLE_FONT_SIZE = 18
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
class ConfirmationBox(QMessageBox):
|
|
68
|
-
def __init__(self, text: str, title=None, parent=None):
|
|
69
|
-
super().__init__(parent)
|
|
70
|
-
self.setWindowTitle(title)
|
|
71
|
-
self.setText(text)
|
|
72
|
-
self.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
class OGSETUIView:
|
|
76
|
-
...
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
STATES = [
|
|
80
|
-
["Interlock", Indic.BLACK],
|
|
81
|
-
["Power", Indic.BLACK],
|
|
82
|
-
["Laser", Indic.BLACK],
|
|
83
|
-
["Lamp", Indic.BLACK],
|
|
84
|
-
["PSU", Indic.BLACK],
|
|
85
|
-
["LDLS", Indic.GREEN],
|
|
86
|
-
["FW moving", Indic.BLACK],
|
|
87
|
-
]
|
|
88
|
-
|
|
89
|
-
FAULTS = [
|
|
90
|
-
["Lamp Fault", Indic.GREEN],
|
|
91
|
-
["Controller Fault", Indic.GREEN],
|
|
92
|
-
]
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
class StatusWidget(QWidget):
|
|
96
|
-
def __init__(self):
|
|
97
|
-
super().__init__()
|
|
98
|
-
|
|
99
|
-
vbox = QVBoxLayout()
|
|
100
|
-
|
|
101
|
-
self.title = QLabel("Status")
|
|
102
|
-
font = self.title.font()
|
|
103
|
-
font.setPointSize(TITLE_FONT_SIZE)
|
|
104
|
-
font.setBold(True)
|
|
105
|
-
self.title.setFont(font)
|
|
106
|
-
|
|
107
|
-
self.states = States(STATES, shape=ShapeEnum.SQUARE, title=None)
|
|
108
|
-
|
|
109
|
-
vbox.addWidget(self.title, alignment=QtCore.Qt.AlignHCenter)
|
|
110
|
-
vbox.addWidget(self.states)
|
|
111
|
-
|
|
112
|
-
self.setLayout(vbox)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
class FaultsWidget(QWidget):
|
|
116
|
-
def __init__(self):
|
|
117
|
-
super().__init__()
|
|
118
|
-
|
|
119
|
-
vbox = QVBoxLayout()
|
|
120
|
-
|
|
121
|
-
self.title = QLabel("Fault Detection")
|
|
122
|
-
font = self.title.font()
|
|
123
|
-
font.setPointSize(TITLE_FONT_SIZE)
|
|
124
|
-
font.setBold(True)
|
|
125
|
-
self.title.setFont(font)
|
|
126
|
-
|
|
127
|
-
self.states = States(FAULTS, shape=ShapeEnum.SQUARE, title=None)
|
|
128
|
-
|
|
129
|
-
vbox.addWidget(self.title, alignment=QtCore.Qt.AlignHCenter)
|
|
130
|
-
vbox.addWidget(self.states)
|
|
131
|
-
|
|
132
|
-
self.setLayout(vbox)
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
class AttenuationWidget(QWidget):
|
|
136
|
-
def __init__(self):
|
|
137
|
-
super().__init__()
|
|
138
|
-
|
|
139
|
-
vbox = QVBoxLayout()
|
|
140
|
-
|
|
141
|
-
self.title = QLabel("Attenuation Values")
|
|
142
|
-
font = self.title.font()
|
|
143
|
-
font.setPointSize(TITLE_FONT_SIZE)
|
|
144
|
-
font.setBold(True)
|
|
145
|
-
self.title.setFont(font)
|
|
146
|
-
|
|
147
|
-
vbox.addWidget(self.title, alignment=QtCore.Qt.AlignHCenter)
|
|
148
|
-
|
|
149
|
-
hbox = QHBoxLayout()
|
|
150
|
-
hbox.setContentsMargins(0, 20, 0, 0)
|
|
151
|
-
|
|
152
|
-
labels_vbox = QVBoxLayout()
|
|
153
|
-
labels_vbox.addWidget(QLabel("Index:"))
|
|
154
|
-
labels_vbox.addWidget(QLabel("Factor:"))
|
|
155
|
-
hbox.addLayout(labels_vbox)
|
|
156
|
-
|
|
157
|
-
self.index = QLabel()
|
|
158
|
-
self.factor = QLabel()
|
|
159
|
-
|
|
160
|
-
values_vbox = QVBoxLayout()
|
|
161
|
-
values_vbox.addWidget(self.index, alignment=QtCore.Qt.AlignRight)
|
|
162
|
-
values_vbox.addWidget(self.factor, alignment=QtCore.Qt.AlignRight)
|
|
163
|
-
hbox.addLayout(values_vbox)
|
|
164
|
-
|
|
165
|
-
vbox.addLayout(hbox)
|
|
166
|
-
|
|
167
|
-
self.setLayout(vbox)
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
class PowerMeterWidget(QWidget):
|
|
171
|
-
def __init__(self):
|
|
172
|
-
super().__init__()
|
|
173
|
-
|
|
174
|
-
vbox = QVBoxLayout()
|
|
175
|
-
|
|
176
|
-
self.title = QLabel("Power Meter")
|
|
177
|
-
font = self.title.font()
|
|
178
|
-
font.setPointSize(TITLE_FONT_SIZE)
|
|
179
|
-
font.setBold(True)
|
|
180
|
-
self.title.setFont(font)
|
|
181
|
-
|
|
182
|
-
vbox.addWidget(self.title, alignment=QtCore.Qt.AlignHCenter)
|
|
183
|
-
|
|
184
|
-
vbox_labels = QVBoxLayout()
|
|
185
|
-
vbox_values_1 = QVBoxLayout()
|
|
186
|
-
vbox_units_1 = QVBoxLayout()
|
|
187
|
-
vbox_values_2 = QVBoxLayout()
|
|
188
|
-
vbox_units_2 = QVBoxLayout()
|
|
189
|
-
|
|
190
|
-
hbox = QHBoxLayout()
|
|
191
|
-
|
|
192
|
-
self.power_meter_info = [
|
|
193
|
-
[QLabel("PM1"), QLabel(), QLabel("Watt"), QLabel(), QLabel("ºC")],
|
|
194
|
-
[QLabel("PM2"), QLabel(), QLabel("Watt"), QLabel(), QLabel("ºC")],
|
|
195
|
-
]
|
|
196
|
-
|
|
197
|
-
for pw in self.power_meter_info:
|
|
198
|
-
vbox_labels.addWidget(pw[0])
|
|
199
|
-
|
|
200
|
-
vbox_values_1.addWidget(pw[1])
|
|
201
|
-
pw[1].setStyleSheet("QLabel { background-color : White; }")
|
|
202
|
-
pw[1].setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
|
|
203
|
-
pw[1].setMinimumWidth(80)
|
|
204
|
-
|
|
205
|
-
vbox_units_1.addWidget(pw[2])
|
|
206
|
-
|
|
207
|
-
vbox_values_2.addWidget(pw[3])
|
|
208
|
-
pw[3].setStyleSheet("QLabel { background-color : White; }")
|
|
209
|
-
pw[3].setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
|
|
210
|
-
pw[3].setMinimumWidth(80)
|
|
211
|
-
|
|
212
|
-
vbox_units_2.addWidget(pw[4])
|
|
213
|
-
|
|
214
|
-
# Make sure the labels stay nicely together when vertically resizing the Frame.
|
|
215
|
-
for w in vbox_labels, vbox_values_1, vbox_units_1, vbox_values_2, vbox_units_2:
|
|
216
|
-
w.addStretch(1)
|
|
217
|
-
|
|
218
|
-
hbox.addLayout(vbox_labels)
|
|
219
|
-
hbox.addLayout(vbox_values_1)
|
|
220
|
-
hbox.addLayout(vbox_units_1)
|
|
221
|
-
hbox.addLayout(vbox_values_2)
|
|
222
|
-
hbox.addLayout(vbox_units_2)
|
|
223
|
-
|
|
224
|
-
# Make sure the leds and labels stay nicely together when horizontally resizing the Frame.
|
|
225
|
-
hbox.addStretch(1)
|
|
226
|
-
|
|
227
|
-
gbox = QGroupBox(self)
|
|
228
|
-
gbox.setLayout(hbox)
|
|
229
|
-
|
|
230
|
-
vbox.addWidget(gbox)
|
|
231
|
-
self.setLayout(vbox)
|
|
232
|
-
|
|
233
|
-
@property
|
|
234
|
-
def power_1(self) -> str:
|
|
235
|
-
return self.power_meter_info[0][1].text()
|
|
236
|
-
|
|
237
|
-
@power_1.setter
|
|
238
|
-
def power_1(self, value: str):
|
|
239
|
-
self.power_meter_info[0][1].setText(value)
|
|
240
|
-
|
|
241
|
-
@property
|
|
242
|
-
def power_2(self) -> str:
|
|
243
|
-
return self.power_meter_info[1][1].text()
|
|
244
|
-
|
|
245
|
-
@power_2.setter
|
|
246
|
-
def power_2(self, value: str):
|
|
247
|
-
self.power_meter_info[1][1].setText(value)
|
|
248
|
-
|
|
249
|
-
@property
|
|
250
|
-
def temp_1(self) -> str:
|
|
251
|
-
return self.power_meter_info[0][3].text()
|
|
252
|
-
|
|
253
|
-
@temp_1.setter
|
|
254
|
-
def temp_1(self, value: str):
|
|
255
|
-
self.power_meter_info[0][3].setText(value)
|
|
256
|
-
|
|
257
|
-
@property
|
|
258
|
-
def temp_2(self) -> str:
|
|
259
|
-
return self.power_meter_info[1][3].text()
|
|
260
|
-
|
|
261
|
-
@temp_2.setter
|
|
262
|
-
def temp_2(self, value: str):
|
|
263
|
-
self.power_meter_info[1][3].setText(value)
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
class CommandWidget(QWidget):
|
|
267
|
-
def __init__(self, *, observable):
|
|
268
|
-
super().__init__()
|
|
269
|
-
self.observable = observable
|
|
270
|
-
|
|
271
|
-
power_label = QLabel("Power")
|
|
272
|
-
operate_label = QLabel("Operate")
|
|
273
|
-
att_label = QLabel("Attenuation")
|
|
274
|
-
|
|
275
|
-
self.cmd_power = ToggleButton(
|
|
276
|
-
name="POWER-ON-OFF",
|
|
277
|
-
width=50, height=25,
|
|
278
|
-
status_tip="Power ON or OFF",
|
|
279
|
-
selected=get_resource(":/icons/switch-on-square.svg"),
|
|
280
|
-
not_selected=get_resource(":/icons/switch-off-square.svg"),
|
|
281
|
-
disabled=get_resource(":/icons/switch-disabled-square.svg"),
|
|
282
|
-
)
|
|
283
|
-
# To avoid repainting the on-off button, we monkey patch the mouseReleaseEvent to a function
|
|
284
|
-
# that does nothing, not even calling its super() method.
|
|
285
|
-
self.cmd_power.mouseReleaseEvent = lambda x: None
|
|
286
|
-
# We want to use the pressed signal here instead of the clicked to avoid repainting the
|
|
287
|
-
# button before the confirmation is asked (see self.on_press)
|
|
288
|
-
self.cmd_power.pressed.connect(self.on_press)
|
|
289
|
-
|
|
290
|
-
self.cmd_operate = ToggleButton(
|
|
291
|
-
name="OPERATE-ON-OFF",
|
|
292
|
-
width=50, height=25,
|
|
293
|
-
status_tip="Operate ON or OFF",
|
|
294
|
-
selected=get_resource(":/icons/switch-on-square.svg"),
|
|
295
|
-
not_selected=get_resource(":/icons/switch-off-square.svg"),
|
|
296
|
-
disabled=get_resource(":/icons/switch-disabled-square.svg"),
|
|
297
|
-
)
|
|
298
|
-
self.cmd_operate.clicked.connect(self.on_click)
|
|
299
|
-
|
|
300
|
-
self.att_go_button = TouchButton(
|
|
301
|
-
name="ATTENUATION-GO",
|
|
302
|
-
width=25, height=25,
|
|
303
|
-
status_tip="Set the selected attenuation index",
|
|
304
|
-
selected=get_resource(":/icons/small-buttons-go.svg")
|
|
305
|
-
)
|
|
306
|
-
self.att_go_button.clicked.connect(self.on_click)
|
|
307
|
-
|
|
308
|
-
self.att_plus_button = TouchButton(
|
|
309
|
-
name="ATTENUATION-PLUS",
|
|
310
|
-
width=15, height=15,
|
|
311
|
-
status_tip="Increase the selected attenuation index",
|
|
312
|
-
selected=get_resource(":/icons/small-buttons-plus.svg")
|
|
313
|
-
)
|
|
314
|
-
self.att_plus_button.clicked.connect(self.on_click)
|
|
315
|
-
|
|
316
|
-
self.att_minus_button = TouchButton(
|
|
317
|
-
name="ATTENUATION-MINUS",
|
|
318
|
-
width=15, height=15,
|
|
319
|
-
status_tip="Decrease the selected attenuation index",
|
|
320
|
-
selected=get_resource(":/icons/small-buttons-minus.svg")
|
|
321
|
-
)
|
|
322
|
-
self.att_minus_button.clicked.connect(self.on_click)
|
|
323
|
-
|
|
324
|
-
self.att_index_slider = QSlider(QtCore.Qt.Horizontal)
|
|
325
|
-
self.att_index_slider.setMinimum(0)
|
|
326
|
-
self.att_index_slider.setMaximum(46)
|
|
327
|
-
self.att_index_slider.setSingleStep(1)
|
|
328
|
-
self.att_index_slider.setMinimumWidth(47*2)
|
|
329
|
-
|
|
330
|
-
# sliderMoved is needed for updating the label
|
|
331
|
-
self.att_index_slider.valueChanged.connect(self.slider_value_changed)
|
|
332
|
-
# sliderReleased is used for
|
|
333
|
-
self.att_index_slider.sliderReleased.connect(self.slider_released)
|
|
334
|
-
|
|
335
|
-
self.att_index_slider_position = QLabel()
|
|
336
|
-
self.att_index_slider_position.setMinimumWidth(20)
|
|
337
|
-
|
|
338
|
-
layout = QVBoxLayout()
|
|
339
|
-
|
|
340
|
-
self.title = QLabel("Commanding")
|
|
341
|
-
font = self.title.font()
|
|
342
|
-
font.setPointSize(TITLE_FONT_SIZE)
|
|
343
|
-
font.setBold(True)
|
|
344
|
-
self.title.setFont(font)
|
|
345
|
-
|
|
346
|
-
layout.addWidget(self.title, alignment=QtCore.Qt.AlignHCenter)
|
|
347
|
-
|
|
348
|
-
hbox = QHBoxLayout()
|
|
349
|
-
hbox.addWidget(power_label)
|
|
350
|
-
hbox.addWidget(self.cmd_power)
|
|
351
|
-
layout.addLayout(hbox)
|
|
352
|
-
|
|
353
|
-
hbox = QHBoxLayout()
|
|
354
|
-
hbox.addWidget(operate_label)
|
|
355
|
-
hbox.addWidget(self.cmd_operate)
|
|
356
|
-
layout.addLayout(hbox)
|
|
357
|
-
|
|
358
|
-
hbox = QHBoxLayout()
|
|
359
|
-
hbox.addWidget(att_label)
|
|
360
|
-
hbox.addWidget(self.att_minus_button)
|
|
361
|
-
hbox.addWidget(self.att_index_slider)
|
|
362
|
-
hbox.addWidget(self.att_plus_button)
|
|
363
|
-
hbox.addWidget(self.att_index_slider_position)
|
|
364
|
-
hbox.addWidget(self.att_go_button)
|
|
365
|
-
hbox.setContentsMargins(0, 0, 0, 0)
|
|
366
|
-
layout.addLayout(hbox)
|
|
367
|
-
|
|
368
|
-
layout.addStretch()
|
|
369
|
-
|
|
370
|
-
hbox = QHBoxLayout()
|
|
371
|
-
hbox.addLayout(layout)
|
|
372
|
-
hbox.addStretch()
|
|
373
|
-
|
|
374
|
-
self.setLayout(hbox)
|
|
375
|
-
|
|
376
|
-
def disable_commanding(self):
|
|
377
|
-
self.cmd_operate.disable()
|
|
378
|
-
|
|
379
|
-
def enable_commanding(self):
|
|
380
|
-
self.cmd_operate.enable()
|
|
381
|
-
|
|
382
|
-
def on_click(self, icon: Union[QIcon, bool]):
|
|
383
|
-
# MODULE_LOGGER.info(f"in {self.__class__.__name__}.on_click()")
|
|
384
|
-
|
|
385
|
-
sender = self.sender()
|
|
386
|
-
|
|
387
|
-
# MODULE_LOGGER.info(f"in {self.__class__.__name__} {sender=!s}")
|
|
388
|
-
|
|
389
|
-
# MODULE_LOGGER.info(f"type(sender) = {type(sender)}")
|
|
390
|
-
# MODULE_LOGGER.info(f"sender.text() = {sender.text()}")
|
|
391
|
-
# MODULE_LOGGER.info(f"sender.isCheckable() = {sender.isCheckable()}")
|
|
392
|
-
# MODULE_LOGGER.info(f"sender.isChecked() = {sender.isChecked()}")
|
|
393
|
-
# MODULE_LOGGER.info(f"{type(icon) = }, {icon = }")
|
|
394
|
-
|
|
395
|
-
# This will trigger the update() method on all the observers
|
|
396
|
-
|
|
397
|
-
self.observable.notifyObservers(sender)
|
|
398
|
-
|
|
399
|
-
def slider_moved(self, pos):
|
|
400
|
-
self.att_index_slider_position.setText(str(pos))
|
|
401
|
-
# MODULE_LOGGER.info(f"slider_moved: {pos = }")
|
|
402
|
-
|
|
403
|
-
def slider_pressed(self):
|
|
404
|
-
pos = self.att_index_slider_position.text()
|
|
405
|
-
# MODULE_LOGGER.info(f"slider_pressed: {pos = }")
|
|
406
|
-
|
|
407
|
-
def slider_released(self):
|
|
408
|
-
pos = self.att_index_slider_position.text()
|
|
409
|
-
# MODULE_LOGGER.info(f"slider_released: {pos = }")
|
|
410
|
-
|
|
411
|
-
def slider_value_changed(self, pos):
|
|
412
|
-
self.att_index_slider_position.setText(str(pos))
|
|
413
|
-
# MODULE_LOGGER.info(f"slider_value_changed: {pos = }")
|
|
414
|
-
|
|
415
|
-
def on_press(self):
|
|
416
|
-
# MODULE_LOGGER.info(f"in {self.__class__.__name__}.on_press()")
|
|
417
|
-
|
|
418
|
-
sender = self.sender()
|
|
419
|
-
|
|
420
|
-
# MODULE_LOGGER.info(f"in {self.__class__.__name__} {sender=!s}")
|
|
421
|
-
|
|
422
|
-
if sender.is_selected():
|
|
423
|
-
response = QMessageBox.question(
|
|
424
|
-
self,
|
|
425
|
-
"Confirmation Required",
|
|
426
|
-
"Are you sure to power OFF the OGSE?",
|
|
427
|
-
)
|
|
428
|
-
if response == QMessageBox.Yes:
|
|
429
|
-
self.cmd_power.set_selected(False)
|
|
430
|
-
self.observable.notifyObservers(sender)
|
|
431
|
-
else:
|
|
432
|
-
self.cmd_power.set_selected(True)
|
|
433
|
-
self.observable.notifyObservers(sender)
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
class OGSEGUIView(QMainWindow, Observable):
|
|
437
|
-
def __init__(self):
|
|
438
|
-
super().__init__()
|
|
439
|
-
|
|
440
|
-
self.status_puller = None
|
|
441
|
-
self.threadpool = QThreadPool()
|
|
442
|
-
|
|
443
|
-
self.cs_connection: ToggleButton = ...
|
|
444
|
-
self.device_connection: ToggleButton = ...
|
|
445
|
-
self.help_action: QAction = ...
|
|
446
|
-
self.toolbar: QToolBar = ...
|
|
447
|
-
self.on_off_button: ToggleButton = ...
|
|
448
|
-
|
|
449
|
-
self.setWindowTitle("OGSE Controller GUI")
|
|
450
|
-
self.setGeometry(300, 300, 600, 300)
|
|
451
|
-
|
|
452
|
-
# The mode_label describes the current mode in which the controller is running.
|
|
453
|
-
# The mode can be Proxy, Simulator, Direct
|
|
454
|
-
|
|
455
|
-
self.mode_label = QLabel("")
|
|
456
|
-
|
|
457
|
-
self.create_toolbar()
|
|
458
|
-
self.create_status_bar()
|
|
459
|
-
|
|
460
|
-
self.status = StatusWidget()
|
|
461
|
-
self.power_meter = PowerMeterWidget()
|
|
462
|
-
self.faults = FaultsWidget()
|
|
463
|
-
self.commanding = CommandWidget(observable=self)
|
|
464
|
-
self.attenuation = AttenuationWidget()
|
|
465
|
-
|
|
466
|
-
layout = QHBoxLayout()
|
|
467
|
-
#
|
|
468
|
-
# vbox_layout = QVBoxLayout()
|
|
469
|
-
# vbox_layout.addWidget(self.power_meter)
|
|
470
|
-
# vbox_layout.addWidget(self.commanding)
|
|
471
|
-
# vbox_layout.addStretch()
|
|
472
|
-
#
|
|
473
|
-
layout.addWidget(self.status, alignment=QtCore.Qt.AlignTop)
|
|
474
|
-
# layout.addLayout(vbox_layout)
|
|
475
|
-
# layout.addWidget(self.faults, alignment=QtCore.Qt.AlignTop)
|
|
476
|
-
|
|
477
|
-
grid_layout = QGridLayout()
|
|
478
|
-
grid_layout.setSpacing(0)
|
|
479
|
-
|
|
480
|
-
grid_layout.addWidget(self.power_meter, 0, 0, alignment=QtCore.Qt.AlignTop)
|
|
481
|
-
grid_layout.addWidget(self.attenuation, 0, 1, alignment=QtCore.Qt.AlignTop)
|
|
482
|
-
grid_layout.addWidget(self.faults, 1, 0, alignment=QtCore.Qt.AlignTop)
|
|
483
|
-
grid_layout.addWidget(self.commanding, 1, 1, alignment=QtCore.Qt.AlignTop)
|
|
484
|
-
|
|
485
|
-
layout.addLayout(grid_layout)
|
|
486
|
-
|
|
487
|
-
widget = QWidget()
|
|
488
|
-
widget.setLayout(layout)
|
|
489
|
-
|
|
490
|
-
self.setCentralWidget(widget)
|
|
491
|
-
|
|
492
|
-
def closeEvent(self, event):
|
|
493
|
-
MODULE_LOGGER.info("Window closed, quiting....")
|
|
494
|
-
self.status_puller.quit()
|
|
495
|
-
event.accept()
|
|
496
|
-
|
|
497
|
-
all_threads_finished = self.threadpool.waitForDone(msecs=2000)
|
|
498
|
-
if not all_threads_finished:
|
|
499
|
-
MODULE_LOGGER.warning("Not all threads were finished before the OGSE GUI terminated.")
|
|
500
|
-
|
|
501
|
-
def start_pulling_status(self):
|
|
502
|
-
self.status_puller = worker = StatusPuller(OGSEUIModel())
|
|
503
|
-
self.threadpool.start(worker)
|
|
504
|
-
worker.signals.states.connect(self.worker_states)
|
|
505
|
-
worker.signals.faults.connect(self.worker_faults)
|
|
506
|
-
worker.signals.att.connect(self.worker_att)
|
|
507
|
-
worker.signals.dev.connect(self.worker_dev)
|
|
508
|
-
worker.signals.pm.connect(self.worker_pm)
|
|
509
|
-
|
|
510
|
-
@pyqtSlot(list)
|
|
511
|
-
def worker_states(self, states):
|
|
512
|
-
self.status.states.set_states(states)
|
|
513
|
-
|
|
514
|
-
@pyqtSlot(list)
|
|
515
|
-
def worker_faults(self, faults):
|
|
516
|
-
self.faults.states.set_states(faults)
|
|
517
|
-
|
|
518
|
-
@pyqtSlot(list)
|
|
519
|
-
def worker_att(self, att):
|
|
520
|
-
self.attenuation.index.setText( str(att[0]))
|
|
521
|
-
self.attenuation.factor.setText(str(att[1]))
|
|
522
|
-
|
|
523
|
-
@pyqtSlot(bool)
|
|
524
|
-
def worker_dev(self, dev):
|
|
525
|
-
self.device_connection.set_selected(dev)
|
|
526
|
-
|
|
527
|
-
@pyqtSlot(dict)
|
|
528
|
-
def worker_pm(self, pm):
|
|
529
|
-
self.power_meter.power_1 = f"{pm['power1']:.4e}"
|
|
530
|
-
self.power_meter.power_2 = f"{pm['power2']:.4e}"
|
|
531
|
-
self.power_meter.temp_1 = f"{pm['temp1']:5.2f}"
|
|
532
|
-
self.power_meter.temp_2 = f"{pm['temp2']:5.2f}"
|
|
533
|
-
|
|
534
|
-
def on_click(self, icon: Union[QIcon, bool]):
|
|
535
|
-
# MODULE_LOGGER.info(f"in {self.__class__.__name__}.on_click()")
|
|
536
|
-
|
|
537
|
-
sender = self.sender()
|
|
538
|
-
|
|
539
|
-
# MODULE_LOGGER.info(f"in {self.__class__.__name__} {sender=!s}")
|
|
540
|
-
|
|
541
|
-
# MODULE_LOGGER.info(f"type(sender) = {type(sender)}")
|
|
542
|
-
# MODULE_LOGGER.info(f"sender.text() = {sender.text()}")
|
|
543
|
-
# MODULE_LOGGER.info(f"sender.isCheckable() = {sender.isCheckable()}")
|
|
544
|
-
# MODULE_LOGGER.info(f"sender.isChecked() = {sender.isChecked()}")
|
|
545
|
-
# MODULE_LOGGER.info(f"type(icon) = {type(icon)}")
|
|
546
|
-
|
|
547
|
-
# This will trigger the update() method on all the observers
|
|
548
|
-
|
|
549
|
-
self.notifyObservers(sender)
|
|
550
|
-
|
|
551
|
-
def on_press(self):
|
|
552
|
-
# MODULE_LOGGER.info(f"in {self.__class__.__name__}.on_press()")
|
|
553
|
-
|
|
554
|
-
sender: ToggleButton = self.sender()
|
|
555
|
-
|
|
556
|
-
# MODULE_LOGGER.info(f"in {self.__class__.__name__} {sender=!s}")
|
|
557
|
-
|
|
558
|
-
if sender.is_selected():
|
|
559
|
-
response = QMessageBox.question(
|
|
560
|
-
self,
|
|
561
|
-
"Confirmation Required",
|
|
562
|
-
"Are you sure to switch OFF the OGSE?",
|
|
563
|
-
)
|
|
564
|
-
if response == QMessageBox.Yes:
|
|
565
|
-
self.on_off_button.set_selected(False)
|
|
566
|
-
self.notifyObservers(sender)
|
|
567
|
-
else:
|
|
568
|
-
self.on_off_button.set_selected(True)
|
|
569
|
-
self.notifyObservers(sender)
|
|
570
|
-
|
|
571
|
-
def is_cs_action_enabled(self):
|
|
572
|
-
return self.cs_connection.isEnabled()
|
|
573
|
-
|
|
574
|
-
def disable_cs_action(self):
|
|
575
|
-
self.cs_connection.disable()
|
|
576
|
-
|
|
577
|
-
def enable_cs_action(self):
|
|
578
|
-
self.cs_connection.enable()
|
|
579
|
-
|
|
580
|
-
def check_cs_action(self):
|
|
581
|
-
self.cs_connection.set_selected()
|
|
582
|
-
|
|
583
|
-
def uncheck_cs_action(self):
|
|
584
|
-
self.cs_connection.set_selected(False)
|
|
585
|
-
|
|
586
|
-
def check_device_action(self):
|
|
587
|
-
self.device_connection.set_selected()
|
|
588
|
-
|
|
589
|
-
def uncheck_device_action(self):
|
|
590
|
-
self.device_connection.set_selected(False)
|
|
591
|
-
|
|
592
|
-
def create_status_bar(self):
|
|
593
|
-
|
|
594
|
-
self.statusBar().setStyleSheet("border: 0; background-color: #FFF8DC;")
|
|
595
|
-
self.statusBar().setStyleSheet("QStatusBar::item {border: none;}")
|
|
596
|
-
self.statusBar().addPermanentWidget(VLine())
|
|
597
|
-
self.statusBar().addPermanentWidget(self.mode_label)
|
|
598
|
-
|
|
599
|
-
def create_toolbar(self):
|
|
600
|
-
|
|
601
|
-
# The Reconnect action is used to reconnect to the control server
|
|
602
|
-
|
|
603
|
-
self.cs_connection = ToggleButton(
|
|
604
|
-
name="CS-CONNECT",
|
|
605
|
-
status_tip="connect-disconnect the OGSE control server",
|
|
606
|
-
selected=get_resource(":/icons/cs-connected.svg"),
|
|
607
|
-
not_selected=get_resource(":/icons/cs-not-connected.svg"),
|
|
608
|
-
disabled=get_resource(":/icons/cs-connected-disabled.svg")
|
|
609
|
-
)
|
|
610
|
-
self.cs_connection.clicked.connect(self.on_click)
|
|
611
|
-
|
|
612
|
-
# The Reconnect action is used to reconnect the device
|
|
613
|
-
|
|
614
|
-
self.device_connection = ToggleButton(
|
|
615
|
-
name="DEVICE-CONNECT",
|
|
616
|
-
status_tip="connect-disconnect the OGSE device controller",
|
|
617
|
-
selected=get_resource(":/icons/plugged.svg"),
|
|
618
|
-
not_selected=get_resource(":/icons/unplugged.svg"),
|
|
619
|
-
disabled=get_resource(":/icons/plugged-disabled.svg")
|
|
620
|
-
)
|
|
621
|
-
self.device_connection.clicked.connect(self.on_click)
|
|
622
|
-
|
|
623
|
-
# The HELP button is used to show the on-line help in a browser window
|
|
624
|
-
|
|
625
|
-
help_button = QIcon(str(get_resource(":/icons/info.svg")))
|
|
626
|
-
|
|
627
|
-
self.help_action = QAction(help_button, "INFO", self)
|
|
628
|
-
self.help_action.setToolTip("Browse the on-line documentation")
|
|
629
|
-
self.help_action.triggered.connect(self.on_click)
|
|
630
|
-
|
|
631
|
-
# spacer widget to help with aligning STOP button to the right
|
|
632
|
-
|
|
633
|
-
spacer = QWidget()
|
|
634
|
-
spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
|
|
635
|
-
|
|
636
|
-
self.toolbar = self.addToolBar("MainToolbar")
|
|
637
|
-
self.toolbar.addWidget(self.device_connection)
|
|
638
|
-
self.toolbar.addWidget(self.cs_connection)
|
|
639
|
-
self.toolbar.addWidget(spacer)
|
|
640
|
-
self.toolbar.addAction(self.help_action)
|
|
641
|
-
|
|
642
|
-
return self.toolbar
|
|
643
|
-
|
|
644
|
-
def set_connection_state(self, state):
|
|
645
|
-
# enable or disable all actions that involve a device or cs connection
|
|
646
|
-
# don't change the action buttons for the device nor the cs, that is handled
|
|
647
|
-
# in the caller because it might be a device connection loss that causes this state
|
|
648
|
-
# or a control server, or both...
|
|
649
|
-
|
|
650
|
-
# MODULE_LOGGER.info(f"{state=}")
|
|
651
|
-
|
|
652
|
-
if state == "connected":
|
|
653
|
-
self.commanding.enable_commanding()
|
|
654
|
-
elif state == "disconnected":
|
|
655
|
-
self.commanding.disable_commanding()
|
|
656
|
-
else:
|
|
657
|
-
raise UnknownStateError(
|
|
658
|
-
f"Unknown State ({state}), expected 'connected' or 'disconnected'."
|
|
659
|
-
)
|
|
660
|
-
|
|
661
|
-
def update_status_bar(self, message=None, mode=None, timeout=2000):
|
|
662
|
-
if message:
|
|
663
|
-
self.statusBar().showMessage(message, msecs=timeout)
|
|
664
|
-
if mode:
|
|
665
|
-
self.mode_label.setStyleSheet(
|
|
666
|
-
f"border: 0; " f"color: {'red' if 'Simulator' in mode else 'black'};"
|
|
667
|
-
)
|
|
668
|
-
self.mode_label.setText(f"mode: {mode}")
|
|
669
|
-
self.statusBar().repaint()
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
class OGSEUIModel:
|
|
674
|
-
def __init__(self):
|
|
675
|
-
|
|
676
|
-
self.device = OGSEProxy()
|
|
677
|
-
|
|
678
|
-
def reconnect_device(self):
|
|
679
|
-
self.device.reconnect()
|
|
680
|
-
return self.device.is_connected()
|
|
681
|
-
|
|
682
|
-
def reconnect_cs(self):
|
|
683
|
-
self.device.reconnect_cs()
|
|
684
|
-
return self.device.is_cs_connected()
|
|
685
|
-
|
|
686
|
-
def disconnect(self):
|
|
687
|
-
self.device.disconnect()
|
|
688
|
-
|
|
689
|
-
def disconnect_cs(self):
|
|
690
|
-
try:
|
|
691
|
-
self.device.disconnect_cs()
|
|
692
|
-
except ZMQError as exc:
|
|
693
|
-
MODULE_LOGGER.error(f"{exc=}")
|
|
694
|
-
|
|
695
|
-
def is_cs_connected(self):
|
|
696
|
-
# MODULE_LOGGER.info(f"in {self.__class__.__name__}.is_cs_connected()")
|
|
697
|
-
return self.device.is_cs_connected()
|
|
698
|
-
|
|
699
|
-
def is_device_connected(self):
|
|
700
|
-
# MODULE_LOGGER.info(f"in {self.__class__.__name__}.is_device_connected()")
|
|
701
|
-
response = self.device.is_connected()
|
|
702
|
-
# MODULE_LOGGER.info(f"{self.__class__.__name__}.device.is_connected() = {response}")
|
|
703
|
-
return response if response is not None else False
|
|
704
|
-
|
|
705
|
-
def is_simulator(self):
|
|
706
|
-
return "sim" in self.device.version()
|
|
707
|
-
|
|
708
|
-
def power_on(self):
|
|
709
|
-
MODULE_LOGGER.debug(f"in {self.__class__.__name__}.power_on()")
|
|
710
|
-
self.device.power_on()
|
|
711
|
-
|
|
712
|
-
def power_off(self):
|
|
713
|
-
MODULE_LOGGER.debug(f"in {self.__class__.__name__}.power_off()")
|
|
714
|
-
self.device.power_off()
|
|
715
|
-
|
|
716
|
-
def operate_on(self):
|
|
717
|
-
MODULE_LOGGER.debug(f"in {self.__class__.__name__}.operate_on()")
|
|
718
|
-
self.device.operate_on()
|
|
719
|
-
|
|
720
|
-
def operate_off(self):
|
|
721
|
-
MODULE_LOGGER.debug(f"in {self.__class__.__name__}.operate_off()")
|
|
722
|
-
self.device.operate_off()
|
|
723
|
-
|
|
724
|
-
def set_att_level(
|
|
725
|
-
self,
|
|
726
|
-
index: Optional[int] = None,
|
|
727
|
-
factor: Optional[float] = None,
|
|
728
|
-
position: Optional[Tuple[int, int]] = None,
|
|
729
|
-
):
|
|
730
|
-
MODULE_LOGGER.debug(f"in {self.__class__.__name__}.set_att_level({index=}, "
|
|
731
|
-
f"{factor=}, {position=})")
|
|
732
|
-
if index and factor and position:
|
|
733
|
-
raise ValueError(f"Only one of the keyword arguments can be provided, {index=}, "
|
|
734
|
-
f"{factor=}, {position=}")
|
|
735
|
-
if index:
|
|
736
|
-
self.device.att_set_level_index(index)
|
|
737
|
-
if factor:
|
|
738
|
-
self.device.att_set_level_factor(factor)
|
|
739
|
-
if position:
|
|
740
|
-
self.device.att_set_level_factor(factor)
|
|
741
|
-
|
|
742
|
-
def get_interlock(self) -> bool:
|
|
743
|
-
interlock = self.device.get_interlock()
|
|
744
|
-
return "ON" in interlock
|
|
745
|
-
|
|
746
|
-
def get_power(self) -> bool:
|
|
747
|
-
power = self.device.get_power()
|
|
748
|
-
return "ON" in power
|
|
749
|
-
|
|
750
|
-
def get_operate(self) -> bool:
|
|
751
|
-
operate = self.device.get_operate()
|
|
752
|
-
return "ON" in operate
|
|
753
|
-
|
|
754
|
-
def get_laser(self) -> bool:
|
|
755
|
-
laser = self.device.get_laser()
|
|
756
|
-
return "ON" in laser
|
|
757
|
-
|
|
758
|
-
def get_ldls_status(self):
|
|
759
|
-
ldls = self.device.ldls_status()
|
|
760
|
-
return "OK" in ldls
|
|
761
|
-
|
|
762
|
-
def status(self) -> dict:
|
|
763
|
-
"""
|
|
764
|
-
Returns a dictionary with the following keys:
|
|
765
|
-
|
|
766
|
-
'power', 'lamp', 'interlock', 'psu', 'att_moving', 'att_factor',
|
|
767
|
-
'att_index', 'power1', 'temp1', 'power2', 'temp2'
|
|
768
|
-
"""
|
|
769
|
-
return self.device.status()
|
|
770
|
-
|
|
771
|
-
def pm_power_1(self) -> float:
|
|
772
|
-
status = self.device.status()
|
|
773
|
-
return status["power1"]
|
|
774
|
-
|
|
775
|
-
def pm_power_2(self) -> float:
|
|
776
|
-
status = self.device.status()
|
|
777
|
-
return status["power2"]
|
|
778
|
-
|
|
779
|
-
def pm_temperature_1(self) -> float:
|
|
780
|
-
status = self.device.status()
|
|
781
|
-
return status["temp1"]
|
|
782
|
-
|
|
783
|
-
def pm_temperature_2(self) -> float:
|
|
784
|
-
status = self.device.status()
|
|
785
|
-
return status["temp2"]
|
|
786
|
-
|
|
787
|
-
def get_lamp_fault(self):
|
|
788
|
-
fault = self.device.get_lamp_fault()
|
|
789
|
-
|
|
790
|
-
# get_lamp_fault response contains 'NO-ERROR' if all good, and 'ERROR' if there
|
|
791
|
-
# was an error. The model will return True if there is a fault detected!
|
|
792
|
-
|
|
793
|
-
return "NO-ERROR" not in fault
|
|
794
|
-
|
|
795
|
-
def get_controller_fault(self):
|
|
796
|
-
fault = self.device.get_controller_fault()
|
|
797
|
-
|
|
798
|
-
# get_controller_fault response contains 'NO-ERROR' if all good, and 'ERROR' if there
|
|
799
|
-
# was an error. The model will return True if there is a fault detected!
|
|
800
|
-
|
|
801
|
-
return "NO-ERROR" not in fault
|
|
802
|
-
|
|
803
|
-
def set_attenuation_index(self, index):
|
|
804
|
-
# MODULE_LOGGER.info(f"set_attenuation_index to {index} ({type(index)=})")
|
|
805
|
-
self.device.att_set_level_index(int(index))
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
class StatusSignals(QObject):
|
|
809
|
-
states = pyqtSignal(list)
|
|
810
|
-
faults = pyqtSignal(list)
|
|
811
|
-
att = pyqtSignal(list)
|
|
812
|
-
dev = pyqtSignal(bool)
|
|
813
|
-
pm = pyqtSignal(dict)
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
class StatusPuller(QRunnable):
|
|
817
|
-
def __init__(self, model: OGSEUIModel):
|
|
818
|
-
super().__init__()
|
|
819
|
-
self.signals = StatusSignals()
|
|
820
|
-
self.model = model
|
|
821
|
-
self.quit_request = False
|
|
822
|
-
|
|
823
|
-
@pyqtSlot()
|
|
824
|
-
def run(self):
|
|
825
|
-
while not self.quit_request:
|
|
826
|
-
|
|
827
|
-
self.signals.dev.emit(self.model.is_device_connected())
|
|
828
|
-
|
|
829
|
-
# Set all the status LEDs
|
|
830
|
-
|
|
831
|
-
status = self.model.status()
|
|
832
|
-
states = [
|
|
833
|
-
Indic.GREEN if 'ON' in status["interlock"] else Indic.BLACK,
|
|
834
|
-
Indic.GREEN if 'ON' in status["power"] else Indic.BLACK,
|
|
835
|
-
Indic.GREEN if self.model.get_laser() else Indic.BLACK,
|
|
836
|
-
Indic.GREEN if 'ON' in status["lamp"] else Indic.BLACK,
|
|
837
|
-
Indic.GREEN if 'ON' in status["psu"] else Indic.BLACK,
|
|
838
|
-
Indic.GREEN if self.model.get_ldls_status() else Indic.BLACK,
|
|
839
|
-
Indic.ORANGE if status["att_moving"] else Indic.BLACK,
|
|
840
|
-
]
|
|
841
|
-
self.signals.states.emit(states)
|
|
842
|
-
|
|
843
|
-
self.signals.pm.emit(
|
|
844
|
-
{
|
|
845
|
-
"power1": status['power1'],
|
|
846
|
-
"power2": status['power2'],
|
|
847
|
-
"temp1": status['temp1'],
|
|
848
|
-
"temp2": status['temp2'],
|
|
849
|
-
})
|
|
850
|
-
|
|
851
|
-
# Set the fault detection on the lamp and controller
|
|
852
|
-
|
|
853
|
-
faults = [
|
|
854
|
-
Indic.RED if self.model.get_lamp_fault() else Indic.GREEN,
|
|
855
|
-
Indic.RED if self.model.get_controller_fault() else Indic.GREEN,
|
|
856
|
-
]
|
|
857
|
-
self.signals.faults.emit(faults)
|
|
858
|
-
|
|
859
|
-
self.signals.att.emit([status["att_index"], status["att_factor"]])
|
|
860
|
-
|
|
861
|
-
def quit(self):
|
|
862
|
-
self.quit_request = True
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
class OGSEUIController(Observer):
|
|
866
|
-
def __init__(self, model: OGSEUIModel, view: Union[OGSEGUIView, OGSETUIView]):
|
|
867
|
-
super().__init__()
|
|
868
|
-
|
|
869
|
-
self.model = model
|
|
870
|
-
self.view = view
|
|
871
|
-
|
|
872
|
-
self.view.addObserver(self)
|
|
873
|
-
|
|
874
|
-
self.help_window = HelpWindow(topic_url=HELP_TOPICS["ogse_ui"])
|
|
875
|
-
|
|
876
|
-
self.states_capture_timer_interval = 1000 # [ms]
|
|
877
|
-
self.create_timer()
|
|
878
|
-
|
|
879
|
-
if self.model.is_cs_connected():
|
|
880
|
-
mode = f"Proxy{' [Simulator]' if self.model.is_simulator() else ''}"
|
|
881
|
-
self.view.update_status_bar(mode=mode)
|
|
882
|
-
self.view.check_cs_action()
|
|
883
|
-
else:
|
|
884
|
-
self.view.uncheck_cs_action()
|
|
885
|
-
# if the control server is not connected, we should not check for the other connection
|
|
886
|
-
# status but just uncheck actions and return
|
|
887
|
-
self.view.uncheck_device_action()
|
|
888
|
-
self.view.set_connection_state("disconnected")
|
|
889
|
-
self.stop_timer()
|
|
890
|
-
return
|
|
891
|
-
|
|
892
|
-
if self.model.is_device_connected():
|
|
893
|
-
self.view.check_device_action()
|
|
894
|
-
else:
|
|
895
|
-
self.view.uncheck_device_action()
|
|
896
|
-
|
|
897
|
-
if self.has_connection():
|
|
898
|
-
self.view.set_connection_state("connected")
|
|
899
|
-
self.start_timer()
|
|
900
|
-
else:
|
|
901
|
-
self.view.set_connection_state("disconnected")
|
|
902
|
-
self.stop_timer()
|
|
903
|
-
|
|
904
|
-
self.view.start_pulling_status()
|
|
905
|
-
|
|
906
|
-
def has_connection(self):
|
|
907
|
-
"""
|
|
908
|
-
Returns True if the controller has a connection to the device. This takes into account
|
|
909
|
-
that the control server might be disabled when the controller is directly connected to
|
|
910
|
-
the device or to a simulator.
|
|
911
|
-
"""
|
|
912
|
-
if self.view.is_cs_action_enabled():
|
|
913
|
-
return bool(self.model.is_device_connected() and self.model.is_cs_connected())
|
|
914
|
-
else:
|
|
915
|
-
return bool(self.model.is_device_connected())
|
|
916
|
-
|
|
917
|
-
def create_timer(self):
|
|
918
|
-
"""Create a Timer that will update the States every second."""
|
|
919
|
-
|
|
920
|
-
self.states_capture_timer = QTimer()
|
|
921
|
-
self.states_capture_timer.timeout.connect(self.update_state)
|
|
922
|
-
self.states_capture_timer.setInterval(self.states_capture_timer_interval)
|
|
923
|
-
|
|
924
|
-
def start_timer(self):
|
|
925
|
-
self.states_capture_timer.start()
|
|
926
|
-
|
|
927
|
-
def stop_timer(self):
|
|
928
|
-
self.states_capture_timer.stop()
|
|
929
|
-
|
|
930
|
-
def do(self, actions):
|
|
931
|
-
# This method is part of the Observer protocol and will be called when there is an
|
|
932
|
-
# action requested by the Observable.
|
|
933
|
-
|
|
934
|
-
for action, value in actions.items():
|
|
935
|
-
...
|
|
936
|
-
|
|
937
|
-
def update(self, changed_object):
|
|
938
|
-
# This method is part of the Observer protocol and will be called when there is a
|
|
939
|
-
# notification of a change in the Observable.
|
|
940
|
-
|
|
941
|
-
text = changed_object.text()
|
|
942
|
-
# MODULE_LOGGER.debug(f"in {self.__class__.__name__}.update({type(changed_object)}), text=\"{text}\"")
|
|
943
|
-
|
|
944
|
-
if text == "INFO":
|
|
945
|
-
self.help_window.show()
|
|
946
|
-
|
|
947
|
-
if text == "POWER-ON-OFF":
|
|
948
|
-
obj: ToggleButton = changed_object
|
|
949
|
-
if obj.state == BUTTON_SELECTED:
|
|
950
|
-
self.model.power_on()
|
|
951
|
-
# Should we also execute `operate_on()` or leave that to the user by pressing
|
|
952
|
-
# the button in the GUI?
|
|
953
|
-
self.view.commanding.cmd_operate.enable()
|
|
954
|
-
else:
|
|
955
|
-
self.model.operate_off()
|
|
956
|
-
self.model.power_off()
|
|
957
|
-
self.view.commanding.cmd_operate.disable()
|
|
958
|
-
|
|
959
|
-
if text == "OPERATE-ON-OFF":
|
|
960
|
-
if changed_object.is_selected():
|
|
961
|
-
self.model.operate_on()
|
|
962
|
-
else:
|
|
963
|
-
self.model.operate_off()
|
|
964
|
-
|
|
965
|
-
if text == "ATTENUATION-GO":
|
|
966
|
-
position = self.view.commanding.att_index_slider_position.text()
|
|
967
|
-
self.model.set_attenuation_index(position)
|
|
968
|
-
|
|
969
|
-
if text == "ATTENUATION-PLUS":
|
|
970
|
-
position = min(self.view.commanding.att_index_slider.value() + 1, 46)
|
|
971
|
-
self.view.commanding.att_index_slider_position.setText(str(position))
|
|
972
|
-
self.view.commanding.att_index_slider.setSliderPosition(position)
|
|
973
|
-
|
|
974
|
-
if text == "ATTENUATION-MINUS":
|
|
975
|
-
position = max(self.view.commanding.att_index_slider.value() - 1, 0)
|
|
976
|
-
self.view.commanding.att_index_slider_position.setText(str(position))
|
|
977
|
-
self.view.commanding.att_index_slider.setSliderPosition(position)
|
|
978
|
-
|
|
979
|
-
if text == "CS-CONNECT":
|
|
980
|
-
if changed_object.is_selected():
|
|
981
|
-
MODULE_LOGGER.debug("Reconnecting the OGSE Control Server.")
|
|
982
|
-
self.model.reconnect_cs()
|
|
983
|
-
# if not self.model.has_commands():
|
|
984
|
-
# self.model.load_commands()
|
|
985
|
-
self.start_timer()
|
|
986
|
-
if self.model.is_device_connected() and self.model.is_cs_connected():
|
|
987
|
-
self.view.set_connection_state("connected")
|
|
988
|
-
self.view.device_connection.enable()
|
|
989
|
-
else:
|
|
990
|
-
MODULE_LOGGER.debug("Disconnecting the OGSE Control Server.")
|
|
991
|
-
self.stop_timer()
|
|
992
|
-
self.model.disconnect_cs()
|
|
993
|
-
self.view.device_connection.disable()
|
|
994
|
-
self.view.set_connection_state("disconnected")
|
|
995
|
-
return
|
|
996
|
-
|
|
997
|
-
if text == "DEVICE-CONNECT":
|
|
998
|
-
if changed_object.is_selected():
|
|
999
|
-
MODULE_LOGGER.debug("Reconnecting the OGSE device controller.")
|
|
1000
|
-
if self.model.reconnect_device():
|
|
1001
|
-
self.view.set_connection_state("connected")
|
|
1002
|
-
# if not self.model.has_commands():
|
|
1003
|
-
# self.model.load_commands()
|
|
1004
|
-
self.start_timer()
|
|
1005
|
-
else:
|
|
1006
|
-
self.view.device_connection.set_selected(False)
|
|
1007
|
-
else:
|
|
1008
|
-
MODULE_LOGGER.debug("Disconnecting the OGSE device Controller.")
|
|
1009
|
-
self.stop_timer()
|
|
1010
|
-
self.model.disconnect()
|
|
1011
|
-
self.view.set_connection_state("disconnected")
|
|
1012
|
-
return
|
|
1013
|
-
|
|
1014
|
-
def update_state(self):
|
|
1015
|
-
# MODULE_LOGGER.info(f"in {self.__class__.__name__}.update_state()")
|
|
1016
|
-
# MODULE_LOGGER.info("Disabled update_state() from OGSEUIController")
|
|
1017
|
-
# return
|
|
1018
|
-
|
|
1019
|
-
self.view.device_connection.set_selected(self.model.is_device_connected())
|
|
1020
|
-
|
|
1021
|
-
m = self.model
|
|
1022
|
-
|
|
1023
|
-
# Set all the status LEDs
|
|
1024
|
-
|
|
1025
|
-
status = m.status()
|
|
1026
|
-
states = [
|
|
1027
|
-
Indic.GREEN if 'ON' in status["interlock"] else Indic.BLACK,
|
|
1028
|
-
Indic.GREEN if 'ON' in status["power"] else Indic.BLACK,
|
|
1029
|
-
Indic.GREEN if m.get_laser() else Indic.BLACK,
|
|
1030
|
-
Indic.GREEN if 'ON' in status["lamp"] else Indic.BLACK,
|
|
1031
|
-
Indic.GREEN if 'ON' in status["psu"] else Indic.BLACK,
|
|
1032
|
-
Indic.GREEN if m.get_ldls_status() else Indic.BLACK,
|
|
1033
|
-
Indic.ORANGE if status["att_moving"] else Indic.BLACK,
|
|
1034
|
-
]
|
|
1035
|
-
self.view.status.states.set_states(states)
|
|
1036
|
-
|
|
1037
|
-
# Set the value of the power meter
|
|
1038
|
-
|
|
1039
|
-
self.view.power_meter.power_1 = f"{status['power1']:.4e}"
|
|
1040
|
-
self.view.power_meter.power_2 = f"{status['power2']:.4e}"
|
|
1041
|
-
self.view.power_meter.temp_1 = f"{status['temp1']:5.2f}"
|
|
1042
|
-
self.view.power_meter.temp_2 = f"{status['temp2']:5.2f}"
|
|
1043
|
-
|
|
1044
|
-
# Set the fault detection on the lamp and controller
|
|
1045
|
-
|
|
1046
|
-
states = [
|
|
1047
|
-
Indic.RED if m.get_lamp_fault() else Indic.GREEN,
|
|
1048
|
-
Indic.RED if m.get_controller_fault() else Indic.GREEN,
|
|
1049
|
-
]
|
|
1050
|
-
self.view.faults.states.set_states(states)
|
|
1051
|
-
|
|
1052
|
-
if m.get_operate():
|
|
1053
|
-
self.view.commanding.cmd_operate.set_selected(True)
|
|
1054
|
-
else:
|
|
1055
|
-
self.view.commanding.cmd_operate.set_selected(False)
|
|
1056
|
-
|
|
1057
|
-
if 'ON' in status["power"]:
|
|
1058
|
-
self.view.commanding.cmd_power.set_selected(True)
|
|
1059
|
-
self.view.commanding.enable_commanding()
|
|
1060
|
-
else:
|
|
1061
|
-
self.view.commanding.cmd_power.set_selected(False)
|
|
1062
|
-
self.view.commanding.disable_commanding()
|
|
1063
|
-
|
|
1064
|
-
self.view.attenuation.index.setText( str(status["att_index"]))
|
|
1065
|
-
self.view.attenuation.factor.setText(str(status["att_factor"]))
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
def main():
|
|
1069
|
-
lock_file = QLockFile(str(Path("~/ogse_ui.app.lock").expanduser()))
|
|
1070
|
-
|
|
1071
|
-
app_logo = get_resource(":/icons/logo-ogse.svg")
|
|
1072
|
-
app = QApplication(sys.argv)
|
|
1073
|
-
app.setWindowIcon(QIcon(str(app_logo)))
|
|
1074
|
-
|
|
1075
|
-
if lock_file.tryLock(100):
|
|
1076
|
-
|
|
1077
|
-
process_status = ProcessStatus()
|
|
1078
|
-
|
|
1079
|
-
timer_thread = threading.Thread(target=do_every, args=(10, process_status.update))
|
|
1080
|
-
timer_thread.daemon = True
|
|
1081
|
-
timer_thread.start()
|
|
1082
|
-
|
|
1083
|
-
start_http_server(GUI_SETTINGS.METRICS_PORT)
|
|
1084
|
-
|
|
1085
|
-
os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "1"
|
|
1086
|
-
QApplication.setHighDpiScaleFactorRoundingPolicy(
|
|
1087
|
-
QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
|
|
1088
|
-
|
|
1089
|
-
view = OGSEGUIView()
|
|
1090
|
-
model = OGSEUIModel()
|
|
1091
|
-
OGSEUIController(model, view)
|
|
1092
|
-
|
|
1093
|
-
view.show()
|
|
1094
|
-
|
|
1095
|
-
return app.exec_()
|
|
1096
|
-
else:
|
|
1097
|
-
error_message = QMessageBox()
|
|
1098
|
-
error_message.setIcon(QMessageBox.Warning)
|
|
1099
|
-
error_message.setWindowTitle("Error")
|
|
1100
|
-
error_message.setText("The OGSE GUI application is already running!")
|
|
1101
|
-
error_message.setStandardButtons(QMessageBox.Ok)
|
|
1102
|
-
|
|
1103
|
-
return error_message.exec()
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
if __name__ == '__main__':
|
|
1107
|
-
|
|
1108
|
-
sys.exit(main())
|