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/dpu/dpu_ui.py
DELETED
|
@@ -1,671 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module implements the image display for the N-FEE data and housekeeping.
|
|
3
|
-
|
|
4
|
-
The DPU GUI can be started from the command line with the `dpu_ui` command. The GUI will connect to the
|
|
5
|
-
data distribution port of the DPU Processor. For this to work, you will need to have at least a DPU control server
|
|
6
|
-
running.
|
|
7
|
-
|
|
8
|
-
"""
|
|
9
|
-
import contextlib
|
|
10
|
-
import logging
|
|
11
|
-
import multiprocessing
|
|
12
|
-
import os
|
|
13
|
-
import pickle
|
|
14
|
-
import sys
|
|
15
|
-
import threading
|
|
16
|
-
from functools import partial
|
|
17
|
-
from pathlib import Path
|
|
18
|
-
|
|
19
|
-
from PyQt5.QtCore import QLockFile
|
|
20
|
-
from PyQt5.QtCore import QModelIndex
|
|
21
|
-
from PyQt5.QtCore import Qt
|
|
22
|
-
from PyQt5.QtGui import QFont
|
|
23
|
-
from PyQt5.QtWidgets import QMessageBox
|
|
24
|
-
from PyQt5.QtWidgets import QTableView
|
|
25
|
-
|
|
26
|
-
from egse.bits import bit_set
|
|
27
|
-
from egse.dpu.hdf5_model import RegisterTableModel
|
|
28
|
-
from egse.gui.led import Indic
|
|
29
|
-
from egse.gui.led import LED
|
|
30
|
-
from egse.setup import SetupError
|
|
31
|
-
from egse.setup import load_setup
|
|
32
|
-
|
|
33
|
-
multiprocessing.current_process().name = "dpu_ui"
|
|
34
|
-
|
|
35
|
-
import zmq
|
|
36
|
-
from PyQt5 import QtCore
|
|
37
|
-
from PyQt5.QtCore import QObject
|
|
38
|
-
from PyQt5.QtCore import QRunnable
|
|
39
|
-
from PyQt5.QtCore import QThreadPool
|
|
40
|
-
from PyQt5.QtCore import pyqtSignal
|
|
41
|
-
from PyQt5.QtCore import pyqtSlot
|
|
42
|
-
from PyQt5.QtGui import QIcon
|
|
43
|
-
from PyQt5.QtWidgets import QApplication
|
|
44
|
-
from PyQt5.QtWidgets import QHBoxLayout
|
|
45
|
-
from PyQt5.QtWidgets import QLabel
|
|
46
|
-
from PyQt5.QtWidgets import QMainWindow
|
|
47
|
-
from PyQt5.QtWidgets import QStatusBar
|
|
48
|
-
from PyQt5.QtWidgets import QTabWidget
|
|
49
|
-
from PyQt5.QtWidgets import QVBoxLayout
|
|
50
|
-
from PyQt5.QtWidgets import QWidget
|
|
51
|
-
from prometheus_client import start_http_server
|
|
52
|
-
|
|
53
|
-
from egse.dpu.ccd_ui import ImageCreatorFullSize
|
|
54
|
-
from egse.dpu.ccd_ui import NFEE4CCDWidget
|
|
55
|
-
from egse.dpu.hk_ui import NFEEHousekeepingWidget
|
|
56
|
-
from egse.fee import convert_ccd_order_value
|
|
57
|
-
from egse.fee import n_fee_mode
|
|
58
|
-
from egse.process import ProcessStatus
|
|
59
|
-
from egse.reg import RegisterMap
|
|
60
|
-
from egse.resource import get_resource
|
|
61
|
-
from egse.settings import Settings
|
|
62
|
-
from egse.system import do_every
|
|
63
|
-
from egse.zmq import MessageIdentifier
|
|
64
|
-
|
|
65
|
-
LOGGER = logging.getLogger("egse.dpu.dpu_ui")
|
|
66
|
-
|
|
67
|
-
DPU_SETTINGS = Settings.load("DPU Processor")
|
|
68
|
-
GUI_SETTINGS = Settings.load("DPU GUI")
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
class WorkerSignals(QObject):
|
|
72
|
-
"""
|
|
73
|
-
Defines the signals available from a running worker thread.
|
|
74
|
-
|
|
75
|
-
Supported signals are:
|
|
76
|
-
|
|
77
|
-
finished
|
|
78
|
-
No data
|
|
79
|
-
|
|
80
|
-
error
|
|
81
|
-
`str` Exception string
|
|
82
|
-
|
|
83
|
-
result
|
|
84
|
-
`dict` data returned from processing
|
|
85
|
-
|
|
86
|
-
"""
|
|
87
|
-
|
|
88
|
-
finished = pyqtSignal()
|
|
89
|
-
error = pyqtSignal(str)
|
|
90
|
-
data = pyqtSignal(int, object)
|
|
91
|
-
stalled = pyqtSignal(bool)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
class DataMonitor(QRunnable):
|
|
95
|
-
def __init__(self, hostname: str, port: int):
|
|
96
|
-
super().__init__()
|
|
97
|
-
self.signals = WorkerSignals()
|
|
98
|
-
self.hostname = hostname
|
|
99
|
-
self.port = port
|
|
100
|
-
self.quit_request = False
|
|
101
|
-
self.receiver = None
|
|
102
|
-
|
|
103
|
-
@pyqtSlot()
|
|
104
|
-
def run(self):
|
|
105
|
-
|
|
106
|
-
context = zmq.Context.instance()
|
|
107
|
-
self.receiver = context.socket(zmq.SUB)
|
|
108
|
-
self.receiver.subscribe("")
|
|
109
|
-
|
|
110
|
-
LOGGER.debug(f"Data Monitor connecting to {self.hostname}:{self.port}")
|
|
111
|
-
|
|
112
|
-
self.receiver.connect(f"tcp://{self.hostname}:{self.port}")
|
|
113
|
-
|
|
114
|
-
while True:
|
|
115
|
-
if self.quit_request:
|
|
116
|
-
break
|
|
117
|
-
|
|
118
|
-
socket_list, _, _ = zmq.select([self.receiver], [], [], timeout=1.0)
|
|
119
|
-
|
|
120
|
-
if self.receiver in socket_list:
|
|
121
|
-
try:
|
|
122
|
-
sync_id, pickle_string = self.receiver.recv_multipart()
|
|
123
|
-
sync_id = int.from_bytes(sync_id, byteorder='big')
|
|
124
|
-
data = pickle.loads(pickle_string)
|
|
125
|
-
self.signals.data.emit(sync_id, data)
|
|
126
|
-
except Exception as exc:
|
|
127
|
-
LOGGER.error("Exception caught!", exc_info=True)
|
|
128
|
-
self.signals.error.emit(str(exc))
|
|
129
|
-
|
|
130
|
-
self.receiver.disconnect(f"tcp://{self.hostname}:{self.port}")
|
|
131
|
-
self.receiver.close()
|
|
132
|
-
self.signals.finished.emit()
|
|
133
|
-
|
|
134
|
-
def quit(self):
|
|
135
|
-
self.quit_request = True
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
class DataPuller(QRunnable):
|
|
139
|
-
def __init__(self, hostname: str, port: int):
|
|
140
|
-
super().__init__()
|
|
141
|
-
self.signals = WorkerSignals()
|
|
142
|
-
self.hostname = hostname
|
|
143
|
-
self.port = port
|
|
144
|
-
self.quit_request = False
|
|
145
|
-
self.receiver = None
|
|
146
|
-
|
|
147
|
-
@pyqtSlot()
|
|
148
|
-
def run(self):
|
|
149
|
-
|
|
150
|
-
n_timeouts = 0
|
|
151
|
-
"""The timeout is 1s, we count the number of timeouts to detect if the DPU or N-FEE might be dead or stalled."""
|
|
152
|
-
|
|
153
|
-
context = zmq.Context.instance()
|
|
154
|
-
self.receiver = context.socket(zmq.SUB)
|
|
155
|
-
self.receiver.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
156
|
-
|
|
157
|
-
# It's not really clear if the 'client' needs to connect to the port or
|
|
158
|
-
# needs to bind to the port. What I see currently is that when the server (DPU Processor)
|
|
159
|
-
# binds, then that process hangs. So, for the moment the DPU Processor connects to the
|
|
160
|
-
# socket but PUSH the data. The result is that only one other process can bind!
|
|
161
|
-
# Needs further investigation.... perhaps we should go back to PUB–SUB...
|
|
162
|
-
# We went back to PUB-SUB...
|
|
163
|
-
|
|
164
|
-
LOGGER.debug(f"Data Puller connecting to {self.hostname}:{self.port}")
|
|
165
|
-
|
|
166
|
-
self.receiver.connect(f"tcp://{self.hostname}:{self.port}")
|
|
167
|
-
|
|
168
|
-
while True:
|
|
169
|
-
if self.quit_request:
|
|
170
|
-
break
|
|
171
|
-
|
|
172
|
-
socket_list, _, _ = zmq.select([self.receiver], [], [], timeout=1.0)
|
|
173
|
-
|
|
174
|
-
if self.receiver in socket_list:
|
|
175
|
-
n_timeouts = 0
|
|
176
|
-
try:
|
|
177
|
-
sync_id, pickle_string = self.receiver.recv_multipart()
|
|
178
|
-
sync_id = int.from_bytes(sync_id, byteorder='big')
|
|
179
|
-
data = pickle.loads(pickle_string)
|
|
180
|
-
self.signals.data.emit(sync_id, data)
|
|
181
|
-
except Exception as exc:
|
|
182
|
-
LOGGER.error("Exception caught!", exc_info=True)
|
|
183
|
-
self.signals.error.emit(str(exc))
|
|
184
|
-
|
|
185
|
-
if len(socket_list) == 0:
|
|
186
|
-
n_timeouts += 1
|
|
187
|
-
if n_timeouts > 7: # at least a timecode should arrive every 6.25s
|
|
188
|
-
self.signals.stalled.emit(True)
|
|
189
|
-
|
|
190
|
-
self.receiver.disconnect(f"tcp://{self.hostname}:{self.port}")
|
|
191
|
-
self.receiver.close()
|
|
192
|
-
self.signals.finished.emit()
|
|
193
|
-
|
|
194
|
-
def quit(self):
|
|
195
|
-
self.quit_request = True
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
class ModeParameterWidget(QWidget):
|
|
199
|
-
def __init__(self, params: dict):
|
|
200
|
-
super().__init__()
|
|
201
|
-
|
|
202
|
-
self.params = params
|
|
203
|
-
|
|
204
|
-
# Use the following line to put a small border around all the parameters
|
|
205
|
-
# self.setStyleSheet('border: 1px solid red;')
|
|
206
|
-
|
|
207
|
-
vbox = QVBoxLayout()
|
|
208
|
-
vbox.setSpacing(4)
|
|
209
|
-
vbox.setContentsMargins(10, 0, 10, 0)
|
|
210
|
-
|
|
211
|
-
vbox.addWidget(QLabel("<b>Mode Parameters</b>"))
|
|
212
|
-
|
|
213
|
-
for name, widget in self.params.items():
|
|
214
|
-
hbox = QHBoxLayout()
|
|
215
|
-
hbox.addWidget(QLabel(name))
|
|
216
|
-
hbox.addWidget(widget)
|
|
217
|
-
vbox.addLayout(hbox)
|
|
218
|
-
|
|
219
|
-
self.setLayout(vbox)
|
|
220
|
-
|
|
221
|
-
def update_par(self, name, value):
|
|
222
|
-
self.params[name].setText(f"{value}")
|
|
223
|
-
|
|
224
|
-
def update_params(self, params: dict):
|
|
225
|
-
for name, value in params.items():
|
|
226
|
-
self.params[name].setText(f"{value}")
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
class ReadoutParameterWidget(QWidget):
|
|
230
|
-
def __init__(self, params: dict):
|
|
231
|
-
super().__init__()
|
|
232
|
-
|
|
233
|
-
self.params = params
|
|
234
|
-
|
|
235
|
-
# Use the following line to put a small border around all the parameters
|
|
236
|
-
# self.setStyleSheet('border: 1px solid red;')
|
|
237
|
-
|
|
238
|
-
vbox = QVBoxLayout()
|
|
239
|
-
vbox.setSpacing(4)
|
|
240
|
-
vbox.setContentsMargins(10, 0, 10, 0)
|
|
241
|
-
|
|
242
|
-
vbox.addWidget(QLabel("<b>Readout Parameters</b>"))
|
|
243
|
-
|
|
244
|
-
for name, widget in self.params.items():
|
|
245
|
-
hbox = QHBoxLayout()
|
|
246
|
-
hbox.addWidget(QLabel(name))
|
|
247
|
-
hbox.addWidget(widget)
|
|
248
|
-
vbox.addLayout(hbox)
|
|
249
|
-
|
|
250
|
-
self.setLayout(vbox)
|
|
251
|
-
|
|
252
|
-
def get_value(self, name):
|
|
253
|
-
return self.params[name].text()
|
|
254
|
-
|
|
255
|
-
def update_par(self, name, value):
|
|
256
|
-
self.params[name].setText(f"{value}")
|
|
257
|
-
|
|
258
|
-
def update_params(self, params: dict):
|
|
259
|
-
for name, value in params.items():
|
|
260
|
-
self.params[name].setText(f"{value}")
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
class StatusParameterWidget(QWidget):
|
|
264
|
-
def __init__(self, params: dict):
|
|
265
|
-
super().__init__()
|
|
266
|
-
|
|
267
|
-
self.params = params
|
|
268
|
-
self.error_flag_names = [
|
|
269
|
-
"Wrong X-Coordinate", "Wrong Y-Coordinate", "E SRAM Full", "F SRAM Full", "AWLA Error",
|
|
270
|
-
"SRAM EDAC Correct", "SRAM EDAC Uncorrect", "Block R EDAC",
|
|
271
|
-
"Disconnect Error", "Escape Error", "Credit Error", "Parity Error", "Lock Error",
|
|
272
|
-
]
|
|
273
|
-
|
|
274
|
-
# Use the following line to put a small border around all the parameters
|
|
275
|
-
# self.setStyleSheet('border: 1px solid red;')
|
|
276
|
-
|
|
277
|
-
vbox = QVBoxLayout()
|
|
278
|
-
vbox.setSpacing(4)
|
|
279
|
-
vbox.setContentsMargins(10, 0, 10, 0)
|
|
280
|
-
|
|
281
|
-
hbox = QHBoxLayout()
|
|
282
|
-
hbox.setAlignment(Qt.AlignLeft)
|
|
283
|
-
hbox.addWidget(QLabel("<b>Status Parameters</b> ("))
|
|
284
|
-
clear_error_flags = QLabel("Clear")
|
|
285
|
-
clear_error_flags.setStyleSheet("color: blue; text-decoration: underline")
|
|
286
|
-
clear_error_flags.mousePressEvent = self.clear_error_flags
|
|
287
|
-
hbox.addWidget(clear_error_flags)
|
|
288
|
-
hbox.addWidget(QLabel(")"))
|
|
289
|
-
vbox.addLayout(hbox)
|
|
290
|
-
|
|
291
|
-
for name, item in self.params.items():
|
|
292
|
-
self.set_format(name, 0)
|
|
293
|
-
self.update_param(name, 0)
|
|
294
|
-
hbox = QHBoxLayout()
|
|
295
|
-
hbox.addWidget(QLabel(name))
|
|
296
|
-
hbox.addWidget(item['led'])
|
|
297
|
-
label: QLabel = item['label']
|
|
298
|
-
font = label.font()
|
|
299
|
-
font.setStyleHint(QFont.TypeWriter)
|
|
300
|
-
label.setFont(font)
|
|
301
|
-
label.mousePressEvent = partial(self.toggle_format, name)
|
|
302
|
-
hbox.addWidget(label)
|
|
303
|
-
vbox.addLayout(hbox)
|
|
304
|
-
|
|
305
|
-
vbox.addStretch()
|
|
306
|
-
self.setLayout(vbox)
|
|
307
|
-
|
|
308
|
-
def toggle_format(self, name, event):
|
|
309
|
-
LOGGER.info(f"{name = }, {event = }")
|
|
310
|
-
format_type = self.params[name]['format_type'] + 1
|
|
311
|
-
format_type = self.params[name]['format_type'] = format_type if 0 <= format_type < 3 else 0
|
|
312
|
-
self.set_format(name, format_type)
|
|
313
|
-
self.refresh_param(name)
|
|
314
|
-
|
|
315
|
-
def set_format(self, name, format_type):
|
|
316
|
-
LOGGER.info(f"{name = }, {format_type = }")
|
|
317
|
-
formats = ["0x{0:04X}", "0b{0:012b}", " {0:d}"]
|
|
318
|
-
self.params[name]['format_type'] = format_type
|
|
319
|
-
self.params[name]['format'] = formats[format_type]
|
|
320
|
-
|
|
321
|
-
def set_value(self, name, value):
|
|
322
|
-
self.params[name]['value'] = value
|
|
323
|
-
|
|
324
|
-
def get_value(self, name):
|
|
325
|
-
return self.params[name]['value']
|
|
326
|
-
|
|
327
|
-
def refresh_param(self, name):
|
|
328
|
-
self.update_param(name, self.params[name]['value'])
|
|
329
|
-
|
|
330
|
-
def clear_error_flags(self, *args):
|
|
331
|
-
self.update_param("Error Flags", 0, "no errors detected")
|
|
332
|
-
|
|
333
|
-
def update_param(self, name, value, tooltip=None):
|
|
334
|
-
format = self.params[name]['format']
|
|
335
|
-
self.params[name]['value'] = value
|
|
336
|
-
self.params[name]['label'].setText(format.format(value))
|
|
337
|
-
if tooltip:
|
|
338
|
-
self.params[name]['label'].setToolTip(tooltip)
|
|
339
|
-
self.params[name]['led'].set_color(Indic.BLACK if value == 0 else self.params[name]['color'])
|
|
340
|
-
|
|
341
|
-
def update_params(self, params: dict):
|
|
342
|
-
LOGGER.info(f"{params = }")
|
|
343
|
-
for name, data in params.items():
|
|
344
|
-
if name == "Error Flags":
|
|
345
|
-
error_flags, frame_counter, timestamp = data
|
|
346
|
-
if self.params[name]['value'] == 0 and error_flags != 0:
|
|
347
|
-
self.update_param(name, error_flags, self._decode_error_flags(error_flags, frame_counter, timestamp))
|
|
348
|
-
# self.refresh_param(name)
|
|
349
|
-
|
|
350
|
-
def _decode_error_flags(self, error_flags, frame_counter, timestamp) -> str:
|
|
351
|
-
|
|
352
|
-
if error_flags == 0:
|
|
353
|
-
return "no errors detected"
|
|
354
|
-
|
|
355
|
-
msg = f"<b>Error on {frame_counter=} </b><br><br>"
|
|
356
|
-
|
|
357
|
-
flags = "".join([
|
|
358
|
-
f"– {name}<br>"
|
|
359
|
-
for idx, name in enumerate(self.error_flag_names)
|
|
360
|
-
if bit_set(error_flags, idx)
|
|
361
|
-
])
|
|
362
|
-
|
|
363
|
-
return msg + flags
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
class MainWindow(QMainWindow):
|
|
367
|
-
def __init__(self):
|
|
368
|
-
super().__init__()
|
|
369
|
-
|
|
370
|
-
self.setWindowTitle("DPU Image Display")
|
|
371
|
-
|
|
372
|
-
self.setStatusBar(QStatusBar(self))
|
|
373
|
-
self.status = self.statusBar()
|
|
374
|
-
|
|
375
|
-
self.image = None
|
|
376
|
-
self.register_map = None
|
|
377
|
-
self.data_puller = None
|
|
378
|
-
self.data_monitor = None
|
|
379
|
-
self.setup = load_setup()
|
|
380
|
-
self.n_fee_side = self.setup.camera.fee.ccd_sides.enum
|
|
381
|
-
|
|
382
|
-
try:
|
|
383
|
-
self.ccd_bin_to_id = self.setup.camera.fee.ccd_numbering.CCD_BIN_TO_ID
|
|
384
|
-
except AttributeError:
|
|
385
|
-
raise SetupError("No entry in the setup for camera.fee.ccd_numbering.CCD_BIN_TO_ID")
|
|
386
|
-
|
|
387
|
-
try:
|
|
388
|
-
self.ccd_bin_to_idx = self.setup.camera.fee.ccd_numbering.CCD_BIN_TO_IDX
|
|
389
|
-
except AttributeError:
|
|
390
|
-
raise SetupError("No entry in the setup for camera.fee.ccd_numbering.CCD_BIN_TO_IDX")
|
|
391
|
-
|
|
392
|
-
try:
|
|
393
|
-
self.sensor_sel = self.setup.camera.fee.sensor_sel.enum
|
|
394
|
-
except AttributeError:
|
|
395
|
-
raise SetupError("No entry in the setup for camera.fee.sensor_sel")
|
|
396
|
-
|
|
397
|
-
self.threadpool = QThreadPool.globalInstance()
|
|
398
|
-
|
|
399
|
-
self.counter = 0
|
|
400
|
-
|
|
401
|
-
self.tabs = QTabWidget()
|
|
402
|
-
|
|
403
|
-
# Use the following line to put a small border around the components of the TAB Widget
|
|
404
|
-
# self.tabs.setStyleSheet('border: 1px solid green;')
|
|
405
|
-
|
|
406
|
-
self.hk_box = NFEEHousekeepingWidget()
|
|
407
|
-
self.ccd_box = NFEE4CCDWidget(self.n_fee_side)
|
|
408
|
-
self.register_box = RegisterWidget()
|
|
409
|
-
|
|
410
|
-
mode_params = {
|
|
411
|
-
'N-FEE Mode': QLabel('OFF'),
|
|
412
|
-
'N-FEE Cycle Time': QLabel(""),
|
|
413
|
-
'DUMP Mode': QLabel(""),
|
|
414
|
-
'Internal Sync': QLabel(""),
|
|
415
|
-
'External Sync': QLabel(""),
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
self.mode_params = ModeParameterWidget(mode_params)
|
|
419
|
-
|
|
420
|
-
readout_params = {
|
|
421
|
-
'Row Start': QLabel('0'),
|
|
422
|
-
'Row End': QLabel("4509"),
|
|
423
|
-
'Num Columns': QLabel("2295"),
|
|
424
|
-
'Readout Order': QLabel(f"{[1, 2, 3, 4]}"),
|
|
425
|
-
'CCD Side': QLabel(""),
|
|
426
|
-
'Number of Cycles': QLabel(""),
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
self.readout_params = ReadoutParameterWidget(readout_params)
|
|
430
|
-
|
|
431
|
-
status_params = {
|
|
432
|
-
'Error Flags': {
|
|
433
|
-
'led': LED(),
|
|
434
|
-
'color': Indic.RED,
|
|
435
|
-
'label': QLabel('0b000000000000'),
|
|
436
|
-
'retain': True,
|
|
437
|
-
},
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
self.status_params = StatusParameterWidget(status_params)
|
|
441
|
-
|
|
442
|
-
self.tabs.addTab(self.ccd_box, "CCD Display")
|
|
443
|
-
self.tabs.addTab(self.hk_box, "HK Packet")
|
|
444
|
-
self.tabs.addTab(self.register_box, "Register Map")
|
|
445
|
-
|
|
446
|
-
params_box = QHBoxLayout()
|
|
447
|
-
|
|
448
|
-
params_box.addWidget(self.mode_params)
|
|
449
|
-
params_box.addWidget(self.readout_params)
|
|
450
|
-
params_box.addWidget(self.status_params)
|
|
451
|
-
|
|
452
|
-
vbox = QVBoxLayout()
|
|
453
|
-
vbox.setSpacing(0) # limit the space between the views and the parameters
|
|
454
|
-
vbox.addWidget(self.tabs, stretch=1)
|
|
455
|
-
vbox.addLayout(params_box)
|
|
456
|
-
|
|
457
|
-
w = QWidget()
|
|
458
|
-
w.setLayout(vbox)
|
|
459
|
-
self.setCentralWidget(w)
|
|
460
|
-
|
|
461
|
-
self.show()
|
|
462
|
-
|
|
463
|
-
self.start_pulling_data()
|
|
464
|
-
self.start_monitoring()
|
|
465
|
-
|
|
466
|
-
def closeEvent(self, event):
|
|
467
|
-
LOGGER.info("Window closed, quiting....")
|
|
468
|
-
self.data_puller.quit()
|
|
469
|
-
self.data_monitor.quit()
|
|
470
|
-
event.accept()
|
|
471
|
-
|
|
472
|
-
all_threads_finished = self.threadpool.waitForDone(msecs=2000)
|
|
473
|
-
if not all_threads_finished:
|
|
474
|
-
LOGGER.warning("Not all threads were finished before the DPU GUI terminated.")
|
|
475
|
-
|
|
476
|
-
def start_pulling_data(self):
|
|
477
|
-
self.data_puller = worker = DataPuller(DPU_SETTINGS.HOSTNAME, DPU_SETTINGS.DATA_DISTRIBUTION_PORT)
|
|
478
|
-
self.threadpool.start(worker)
|
|
479
|
-
worker.signals.data.connect(self.puller_output)
|
|
480
|
-
worker.signals.finished.connect(self.puller_complete)
|
|
481
|
-
worker.signals.error.connect(self.puller_error)
|
|
482
|
-
worker.signals.stalled.connect(self.puller_stalled)
|
|
483
|
-
|
|
484
|
-
def start_monitoring(self):
|
|
485
|
-
self.data_monitor = worker = DataMonitor(DPU_SETTINGS.HOSTNAME, DPU_SETTINGS.MONITORING_PORT)
|
|
486
|
-
self.threadpool.start(worker)
|
|
487
|
-
worker.signals.data.connect(self.monitor_output)
|
|
488
|
-
worker.signals.finished.connect(self.monitor_complete)
|
|
489
|
-
worker.signals.error.connect(self.monitor_error)
|
|
490
|
-
|
|
491
|
-
@pyqtSlot(int, bytes)
|
|
492
|
-
def monitor_output(self, sync_id, data):
|
|
493
|
-
LOGGER.info(f"Data Monitor: sync_id = {MessageIdentifier(sync_id).name}, {data = }")
|
|
494
|
-
if sync_id == MessageIdentifier.SYNC_ERROR_FLAGS:
|
|
495
|
-
params = {
|
|
496
|
-
'Error Flags': data
|
|
497
|
-
}
|
|
498
|
-
self.status_params.update_params(params)
|
|
499
|
-
|
|
500
|
-
@pyqtSlot()
|
|
501
|
-
def monitor_complete(self):
|
|
502
|
-
LOGGER.info("Data Monitor thread complete!")
|
|
503
|
-
# zmq.Context().destroy(linger=0)
|
|
504
|
-
|
|
505
|
-
@pyqtSlot(str)
|
|
506
|
-
def monitor_error(self, t):
|
|
507
|
-
LOGGER.warning(f"Data Monitor ERROR: {t}")
|
|
508
|
-
|
|
509
|
-
@pyqtSlot(int, bytes)
|
|
510
|
-
def puller_output(self, sync_id, data):
|
|
511
|
-
# LOGGER.info(f"Data Puller: sync_id = {MessageIdentifier(sync_id).name}") # Generates a lot of output!
|
|
512
|
-
if sync_id == MessageIdentifier.SYNC_TIMECODE:
|
|
513
|
-
timecode, timestamp = data
|
|
514
|
-
# LOGGER.info(f"TIMECODE: {timecode=}, {timestamp=}")
|
|
515
|
-
if sync_id == MessageIdentifier.SYNC_HK_PACKET:
|
|
516
|
-
hk_packet, timestamp = data
|
|
517
|
-
if self.tabs.currentWidget() is self.hk_box:
|
|
518
|
-
with contextlib.suppress(KeyError):
|
|
519
|
-
self.hk_box.update_fields(hk_packet)
|
|
520
|
-
# LOGGER.info(f"HK_PACKET: {hk_packet.type.frame_number=}, {timestamp=}")
|
|
521
|
-
if hk_packet.type.frame_number == 0:
|
|
522
|
-
pass
|
|
523
|
-
# self.ccd_box.clear_image_data()
|
|
524
|
-
if self.register_map is not None:
|
|
525
|
-
# nr_lines = self.register_map["v_end"] - self.register_map["v_start"] + 1
|
|
526
|
-
# nr_columns = self.register_map["h_end"] + 1
|
|
527
|
-
# self.image = ImageCreator(nr_lines=nr_lines, nr_columns=nr_columns)
|
|
528
|
-
self.image = ImageCreatorFullSize(
|
|
529
|
-
v_start=self.register_map["v_start"],
|
|
530
|
-
v_end=self.register_map["v_end"],
|
|
531
|
-
h_end=self.register_map["h_end"],
|
|
532
|
-
n_fee_side=self.n_fee_side,
|
|
533
|
-
)
|
|
534
|
-
self.register_box.update(self.register_map)
|
|
535
|
-
if sync_id == MessageIdentifier.SYNC_DATA_PACKET:
|
|
536
|
-
data_packet, timestamp = data
|
|
537
|
-
# LOGGER.info(f"DATA_PACKET: {data_packet.type.ccd_number=}, {timestamp=}")
|
|
538
|
-
self.mark_ccd_widget(data_packet.type.ccd_number)
|
|
539
|
-
if self.image is not None:
|
|
540
|
-
self.image.add_data(data_packet)
|
|
541
|
-
if data_packet.type.last_packet:
|
|
542
|
-
self.ccd_box.show_ccd_image(
|
|
543
|
-
self.ccd_bin_to_id[data_packet.type.ccd_number],
|
|
544
|
-
data_packet.type.ccd_side,
|
|
545
|
-
self.image.get_image(data_packet.type.ccd_side)
|
|
546
|
-
)
|
|
547
|
-
|
|
548
|
-
if sync_id == MessageIdentifier.N_FEE_REGISTER_MAP:
|
|
549
|
-
self.register_map = reg = RegisterMap('N-FEE', memory_map=data)
|
|
550
|
-
# LOGGER.info(f"REGISTER_MAP: {reg['ccd_mode_config']=}")
|
|
551
|
-
is_dump_mode = bool(not reg["digitise_en"] and reg["DG_en"] and reg["ccd_mode_config"] == n_fee_mode.FULL_IMAGE_MODE)
|
|
552
|
-
|
|
553
|
-
params = {
|
|
554
|
-
'N-FEE Mode': n_fee_mode(reg["ccd_mode_config"]).name,
|
|
555
|
-
'N-FEE Cycle Time': "25.0s" if not reg["sync_sel"] else f"{reg['int_sync_period']/1000}s",
|
|
556
|
-
'DUMP Mode': is_dump_mode,
|
|
557
|
-
'Internal Sync': "True" if reg["sync_sel"] else "False",
|
|
558
|
-
'External Sync': "False" if reg["sync_sel"] else "True",
|
|
559
|
-
}
|
|
560
|
-
self.mode_params.update_params(params)
|
|
561
|
-
readout_order = reg["ccd_readout_order"]
|
|
562
|
-
readout_order = convert_ccd_order_value(readout_order)
|
|
563
|
-
params = {
|
|
564
|
-
'Row Start': reg["v_start"],
|
|
565
|
-
'Row End': reg["v_end"],
|
|
566
|
-
'Num Columns': reg["h_end"] + 1,
|
|
567
|
-
'Readout Order': readout_order,
|
|
568
|
-
'CCD Side': self.sensor_sel(reg['sensor_sel']).name,
|
|
569
|
-
}
|
|
570
|
-
self.readout_params.update_params(params)
|
|
571
|
-
if is_dump_mode:
|
|
572
|
-
self.ccd_box.unmark()
|
|
573
|
-
if sync_id == MessageIdentifier.NUM_CYCLES:
|
|
574
|
-
# LOGGER.info(f"NUMBER OF CYCLES: {data}")
|
|
575
|
-
self.readout_params.update_par('Number of Cycles', max(0, data))
|
|
576
|
-
|
|
577
|
-
@pyqtSlot()
|
|
578
|
-
def puller_complete(self):
|
|
579
|
-
LOGGER.info("Data Puller thread complete!")
|
|
580
|
-
# zmq.Context().destroy(linger=0)
|
|
581
|
-
|
|
582
|
-
@pyqtSlot(str)
|
|
583
|
-
def puller_error(self, t):
|
|
584
|
-
LOGGER.warning(f"Data Puller ERROR: {t}")
|
|
585
|
-
|
|
586
|
-
@pyqtSlot(bool)
|
|
587
|
-
def puller_stalled(self, flag: bool):
|
|
588
|
-
params = {
|
|
589
|
-
'N-FEE Mode': 'CONNECTION LOST',
|
|
590
|
-
'N-FEE Cycle Time': "",
|
|
591
|
-
'DUMP Mode': "",
|
|
592
|
-
'Internal Sync': "",
|
|
593
|
-
'External Sync': "",
|
|
594
|
-
}
|
|
595
|
-
self.mode_params.update_params(params)
|
|
596
|
-
|
|
597
|
-
def mark_ccd_widget(self, ccd_number: int):
|
|
598
|
-
self.ccd_box.mark(self.ccd_bin_to_idx[ccd_number])
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
class RegisterWidget(QWidget):
|
|
602
|
-
""" Widget to display the FEE register map."""
|
|
603
|
-
|
|
604
|
-
def __init__(self, *args, **kwargs):
|
|
605
|
-
super().__init__(*args, **kwargs)
|
|
606
|
-
|
|
607
|
-
self.register_model = RegisterTableModel(RegisterMap())
|
|
608
|
-
self.table_view = QTableView(self)
|
|
609
|
-
self.table_view.setModel(self.register_model)
|
|
610
|
-
self.table_view.resizeColumnsToContents()
|
|
611
|
-
self.table_view.clicked.connect(self.on_cell_clicked)
|
|
612
|
-
layout = QVBoxLayout(self)
|
|
613
|
-
layout.addWidget(self.table_view)
|
|
614
|
-
|
|
615
|
-
def update(self, register_map: RegisterMap):
|
|
616
|
-
""" Update the register map.
|
|
617
|
-
|
|
618
|
-
Args:
|
|
619
|
-
- register_map: Register map to display.
|
|
620
|
-
"""
|
|
621
|
-
|
|
622
|
-
self.register_model.setRegisterMap(register_map)
|
|
623
|
-
self.register_model.layoutChanged.emit()
|
|
624
|
-
|
|
625
|
-
self.table_view.resizeColumnsToContents()
|
|
626
|
-
self.repaint()
|
|
627
|
-
|
|
628
|
-
def on_cell_clicked(self, index: QModelIndex, *args, **kwargs):
|
|
629
|
-
self.register_model.toggleDisplayRole(index)
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
def main():
|
|
633
|
-
|
|
634
|
-
lock_file = QLockFile(str(Path("~/dpu_ui.app.lock").expanduser()))
|
|
635
|
-
|
|
636
|
-
app_logo = get_resource(":/icons/logo-dpu.svg")
|
|
637
|
-
|
|
638
|
-
app = QApplication(sys.argv)
|
|
639
|
-
app.setWindowIcon(QIcon(str(app_logo)))
|
|
640
|
-
|
|
641
|
-
os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "1"
|
|
642
|
-
|
|
643
|
-
QApplication.setHighDpiScaleFactorRoundingPolicy(
|
|
644
|
-
QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
|
|
645
|
-
|
|
646
|
-
if lock_file.tryLock(100):
|
|
647
|
-
|
|
648
|
-
process_status = ProcessStatus()
|
|
649
|
-
|
|
650
|
-
timer_thread = threading.Thread(target=do_every, args=(10, process_status.update))
|
|
651
|
-
timer_thread.daemon = True
|
|
652
|
-
timer_thread.start()
|
|
653
|
-
|
|
654
|
-
start_http_server(GUI_SETTINGS.METRICS_PORT)
|
|
655
|
-
|
|
656
|
-
window = MainWindow()
|
|
657
|
-
window.show()
|
|
658
|
-
return app.exec()
|
|
659
|
-
|
|
660
|
-
else:
|
|
661
|
-
error_message = QMessageBox()
|
|
662
|
-
error_message.setIcon(QMessageBox.Warning)
|
|
663
|
-
error_message.setWindowTitle("Error")
|
|
664
|
-
error_message.setText("The DPU GUI application is already running!")
|
|
665
|
-
error_message.setStandardButtons(QMessageBox.Ok)
|
|
666
|
-
|
|
667
|
-
return error_message.exec()
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
if __name__ == '__main__':
|
|
671
|
-
sys.exit(main())
|