cgse 2023.38.0__py3-none-any.whl → 2024.1.4__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-2024.1.4.dist-info/METADATA +38 -0
- cgse-2024.1.4.dist-info/RECORD +5 -0
- {cgse-2023.38.0.dist-info → cgse-2024.1.4.dist-info}/WHEEL +1 -2
- cgse-2023.38.0.dist-info/COPYING +0 -674
- cgse-2023.38.0.dist-info/COPYING.LESSER +0 -165
- cgse-2023.38.0.dist-info/METADATA +0 -144
- cgse-2023.38.0.dist-info/RECORD +0 -649
- cgse-2023.38.0.dist-info/entry_points.txt +0 -75
- cgse-2023.38.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5235
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -626
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -912
- 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 -234
- egse/alert/alertman_ui.py +0 -603
- 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 -130
- egse/alert/gsm/beaglebone_protocol.py +0 -48
- 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 -129
- 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 -1015
- egse/confman/confman.yaml +0 -67
- egse/confman/confman_cs.py +0 -239
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -442
- egse/coordinates/__init__.py +0 -531
- egse/coordinates/avoidance.py +0 -103
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -120
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -195
- 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 -1247
- 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 -415
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2681
- egse/dpu/ccd_ui.py +0 -508
- egse/dpu/dpu.py +0 -786
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -668
- egse/dpu/fitsgen.py +0 -2077
- egse/dpu/fitsgen_test.py +0 -752
- 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/constants.py +0 -220
- egse/dsi/esl.py +0 -870
- egse/dsi/rmap.py +0 -1042
- egse/dsi/rmapci.py +0 -37
- egse/dsi/spw.py +0 -154
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -258
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -28
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -51
- egse/fdir/fdir_manager_controller.py +0 -228
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -25
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -37
- egse/fdir/fdir_remote_controller.py +0 -50
- egse/fdir/fdir_remote_cs.py +0 -97
- egse/fdir/fdir_remote_interface.py +0 -14
- egse/fdir/fdir_remote_popup.py +0 -31
- egse/fee/__init__.py +0 -114
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/fee.py +0 -631
- egse/fee/feesim.py +0 -750
- egse/fee/n_fee_hk.py +0 -761
- egse/fee/nfee.py +0 -187
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -24
- egse/filterwheel/eksma/fw8smc4.py +0 -661
- 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 -81
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -111
- 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 -1068
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -712
- egse/fov/fov_ui.py +0 -861
- 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 -135
- 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 -1281
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -588
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- 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 -138
- 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 -196
- egse/hexapod/symetrie/puna_protocol.py +0 -131
- egse/hexapod/symetrie/puna_ui.py +0 -434
- 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 -415
- egse/hexapod/symetrie/zonda_protocol.py +0 -119
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -765
- 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 -69
- 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/macOS/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/macOS/EtherSpaceLink_v34_86.dylib +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 -73
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -98
- 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 -163
- 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 -811
- 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 -603
- egse/proxy.py +0 -522
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -675
- egse/resource.py +0 -333
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -212
- egse/services.yaml +0 -51
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1180
- 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 -69
- 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 -1479
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -247
- 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 -193
- egse/stages/arun/smd3.py +0 -111
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -472
- 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 -904
- 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 -111
- 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 -1004
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -72
- egse/storage/storage_cs.py +0 -214
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -412
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1408
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -874
- 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 -177
- 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 -116
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -99
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -117
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -101
- egse/tempcontrol/beaglebone/beaglebone.py +0 -342
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -135
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -681
- egse/tempcontrol/digalox/digalox.py +0 -107
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -112
- egse/tempcontrol/digalox/digalox_protocol.py +0 -55
- 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 -78
- 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 -73
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -389
- 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 -727
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -875
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -118
- egse/tempcontrol/srs/ptc10_protocol.py +0 -42
- 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 -164
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -193
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -92
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -128
- 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 -102
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -83
- 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 -316
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -704
- 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 -39
- egse/vacuum/pfeiffer/tc400.py +0 -113
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -140
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -24
- egse/vacuum/pfeiffer/tpg261.py +0 -81
- 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 -60
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -24
- 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 -44
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/create_hdf5_report.py +0 -295
- scripts/csl_model.py +0 -436
- scripts/csl_restore_setup.py +0 -230
- scripts/export-grafana-dashboards.py +0 -50
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -59
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -11
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -64
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -61
- 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/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/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/tm_gen/tm_gen_agilent.py +0 -38
- 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
|
@@ -1,940 +0,0 @@
|
|
|
1
|
-
import argparse
|
|
2
|
-
import logging
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
|
|
5
|
-
import sys
|
|
6
|
-
from itertools import compress
|
|
7
|
-
|
|
8
|
-
from egse.resource import get_resource
|
|
9
|
-
|
|
10
|
-
"""
|
|
11
|
-
Qt imports for the FilterwheelView class
|
|
12
|
-
"""
|
|
13
|
-
import pyqtgraph as pg
|
|
14
|
-
from PyQt5.QtGui import QFont, QIcon, QPalette, QPixmap
|
|
15
|
-
from PyQt5.QtWidgets import (QAction, QApplication, QFrame, QGroupBox, QHBoxLayout, QVBoxLayout, QLabel,
|
|
16
|
-
QMainWindow, QLineEdit, QComboBox, QPushButton, QToolButton, QRadioButton,
|
|
17
|
-
QMessageBox)
|
|
18
|
-
from PyQt5.QtCore import QTimer, Qt, QLockFile
|
|
19
|
-
from QLed import QLed
|
|
20
|
-
|
|
21
|
-
from egse.settings import Settings
|
|
22
|
-
from egse.observer import Observable
|
|
23
|
-
from egse.observer import Observer
|
|
24
|
-
from egse.state import UnknownStateError
|
|
25
|
-
from egse.config import find_file, set_logger_levels
|
|
26
|
-
|
|
27
|
-
from egse.filterwheel.eksma.fw8smc4 import FilterWheel8SMC4Controller, FilterWheel8SMC4Proxy, FilterWheel8SMC4Simulator
|
|
28
|
-
from egse.gui import show_warning_message
|
|
29
|
-
|
|
30
|
-
from egse.process import ProcessStatus
|
|
31
|
-
from egse.system import do_every
|
|
32
|
-
|
|
33
|
-
from prometheus_client import start_http_server
|
|
34
|
-
|
|
35
|
-
import threading
|
|
36
|
-
|
|
37
|
-
logging.basicConfig(level=logging.DEBUG, format=Settings.LOG_FORMAT_FULL)
|
|
38
|
-
MODULE_LOGGER = logging.getLogger("8SMC4 GUI")
|
|
39
|
-
|
|
40
|
-
# Note that, in production, the logging level for the different loggers can be changed with a
|
|
41
|
-
# service command `set_logging_level(logger_name, level)`.
|
|
42
|
-
|
|
43
|
-
logger_levels = [
|
|
44
|
-
("egse.protocol", logging.INFO),
|
|
45
|
-
("egse.command", logging.INFO),
|
|
46
|
-
("egse.settings", logging.INFO),
|
|
47
|
-
("egse.config", logging.INFO),
|
|
48
|
-
("git.cmd", logging.INFO),
|
|
49
|
-
]
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
set_logger_levels(logger_levels)
|
|
53
|
-
|
|
54
|
-
SETTINGS = Settings.load("Filter Wheel 8SMC4 Controller")
|
|
55
|
-
GUI_SETTINGS = Settings.load("FW8SMC4 GUI")
|
|
56
|
-
|
|
57
|
-
FONT = QFont("Helvetica", 18)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
class FilterWheelUIView(QMainWindow, Observable):
|
|
61
|
-
def __init__(self):
|
|
62
|
-
super().__init__()
|
|
63
|
-
|
|
64
|
-
# Define those variables that we will need/use in different methods
|
|
65
|
-
|
|
66
|
-
self.clear_action = None
|
|
67
|
-
self.reconnect_action = None
|
|
68
|
-
self.toolbar = None
|
|
69
|
-
self.wheel_control = None
|
|
70
|
-
|
|
71
|
-
#self.homing_led = None
|
|
72
|
-
self.wheel_1 = None
|
|
73
|
-
self.wheel_2 = None
|
|
74
|
-
self.p_wheel_1 = None
|
|
75
|
-
self.p_wheel_2 = None
|
|
76
|
-
self.p_button = None
|
|
77
|
-
self.wheelstatus = []
|
|
78
|
-
self.attenuation_values = []
|
|
79
|
-
|
|
80
|
-
self.setGeometry(300, 300, 1000, 500)
|
|
81
|
-
self.setWindowTitle("eksma Filter Wheel 8SMC4 Controller")
|
|
82
|
-
|
|
83
|
-
self.init_gui()
|
|
84
|
-
|
|
85
|
-
def createToolbar(self):
|
|
86
|
-
image_location = Path(__file__).resolve().parent.parent.parent / "images"
|
|
87
|
-
|
|
88
|
-
# Homing button:
|
|
89
|
-
home_pix = QPixmap(str(find_file("home.svg", in_dir="images")))
|
|
90
|
-
home_icon = QIcon()
|
|
91
|
-
home_icon.addPixmap(home_pix)
|
|
92
|
-
|
|
93
|
-
self.homing_action = QAction(home_icon, "Homing", self)
|
|
94
|
-
self.homing_action.setToolTip("Homing")
|
|
95
|
-
self.homing_action.triggered.connect(self.onClick)
|
|
96
|
-
|
|
97
|
-
# The Reconnect action is used to reconnect the device or control server
|
|
98
|
-
|
|
99
|
-
connected_pix = QPixmap(str(image_location / "connected-100.png"))
|
|
100
|
-
disconnected_pix = QPixmap(str(image_location / "disconnected-100.png"))
|
|
101
|
-
reconnect_icon = QIcon()
|
|
102
|
-
reconnect_icon.addPixmap(connected_pix, QIcon.Normal, QIcon.On)
|
|
103
|
-
reconnect_icon.addPixmap(disconnected_pix, QIcon.Normal, QIcon.Off)
|
|
104
|
-
|
|
105
|
-
self.reconnect_action = QAction(reconnect_icon, "Reconnect", self)
|
|
106
|
-
self.reconnect_action.setToolTip("Reconnect")
|
|
107
|
-
self.reconnect_action.setCheckable(True)
|
|
108
|
-
self.reconnect_action.triggered.connect(self.onClick)
|
|
109
|
-
|
|
110
|
-
# Building the toolbar:
|
|
111
|
-
self.toolbar = self.addToolBar("MainToolbar")
|
|
112
|
-
self.toolbar.addAction(self.reconnect_action)
|
|
113
|
-
self.toolbar.addAction(self.homing_action)
|
|
114
|
-
return self.toolbar
|
|
115
|
-
|
|
116
|
-
def createWheelPositionWidget(self):
|
|
117
|
-
hbox = QHBoxLayout()
|
|
118
|
-
# hbox.setContentsMargins(0, 0, 0, 0)
|
|
119
|
-
hbox.setSpacing(0)
|
|
120
|
-
|
|
121
|
-
tbox = QVBoxLayout()
|
|
122
|
-
tbox.addWidget(QLabel(""))
|
|
123
|
-
tbox.addWidget(QLabel("Position: "))
|
|
124
|
-
tbox.addWidget(QLabel("Attenuation: "))
|
|
125
|
-
tbox.setSpacing(15)
|
|
126
|
-
tbox.setSizeConstraint(0)
|
|
127
|
-
tbox.setAlignment(Qt.AlignTop | Qt.AlignLeft)
|
|
128
|
-
|
|
129
|
-
hbox.addLayout(tbox)
|
|
130
|
-
hbox.setAlignment(Qt.AlignTop | Qt.AlignLeft)
|
|
131
|
-
hbox.setSpacing(0)
|
|
132
|
-
|
|
133
|
-
for positions in range(8):
|
|
134
|
-
hbox.setSpacing(0)
|
|
135
|
-
# label
|
|
136
|
-
pos_label = QLabel(f"{positions + 1}")
|
|
137
|
-
pos_label.setAlignment(Qt.AlignHCenter)
|
|
138
|
-
|
|
139
|
-
# led definitions:
|
|
140
|
-
_led = QLed(self, offColour=QLed.Grey, onColour=QLed.Green)
|
|
141
|
-
_led.setFixedSize(40, 40)
|
|
142
|
-
|
|
143
|
-
# transmission boxes
|
|
144
|
-
editbox = QLineEdit()
|
|
145
|
-
editbox.setReadOnly(True)
|
|
146
|
-
editbox.setAlignment(Qt.AlignHCenter)
|
|
147
|
-
editbox.setFixedSize(40, 35)
|
|
148
|
-
|
|
149
|
-
# building layout:
|
|
150
|
-
vbox = QVBoxLayout()
|
|
151
|
-
vbox.addWidget(pos_label)
|
|
152
|
-
vbox.addWidget(_led)
|
|
153
|
-
vbox.addWidget(editbox)
|
|
154
|
-
vbox.setSpacing(5)
|
|
155
|
-
vbox.setAlignment(Qt.AlignTop)
|
|
156
|
-
hbox.setSpacing(0)
|
|
157
|
-
hbox.addLayout(vbox)
|
|
158
|
-
|
|
159
|
-
hbox.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
|
160
|
-
hbox.setSpacing(0)
|
|
161
|
-
group_box = QGroupBox("Wheel position", self)
|
|
162
|
-
group_box.setLayout(hbox)
|
|
163
|
-
group_box.setFixedWidth(600)
|
|
164
|
-
|
|
165
|
-
return group_box
|
|
166
|
-
|
|
167
|
-
def createWheelControlWidget(self):
|
|
168
|
-
vbox = QVBoxLayout()
|
|
169
|
-
|
|
170
|
-
#### POSITION WIDGETS ####
|
|
171
|
-
|
|
172
|
-
hposition = QHBoxLayout()
|
|
173
|
-
|
|
174
|
-
wheel_label = QLabel("Set the wheels to position: ")
|
|
175
|
-
self.p_wheel_1 = QComboBox()
|
|
176
|
-
self.p_wheel_1.setCurrentIndex(-1)
|
|
177
|
-
self.p_wheel_1.addItem("= wheel 1 =")
|
|
178
|
-
self.p_wheel_1.model().item(0).setEnabled(False)
|
|
179
|
-
self.p_wheel_1.addItems(["position 1", "position 2", "position 3", "position 4", "position 5", "position 6",
|
|
180
|
-
"position 7", "position 8"])
|
|
181
|
-
self.p_wheel_1.setFixedWidth(120)
|
|
182
|
-
|
|
183
|
-
self.p_wheel_2 = QComboBox()
|
|
184
|
-
self.p_wheel_2.setCurrentIndex(-1)
|
|
185
|
-
self.p_wheel_2.addItem("= wheel 2 =")
|
|
186
|
-
self.p_wheel_2.model().item(0).setEnabled(False)
|
|
187
|
-
self.p_wheel_2.addItems(["position 1", "position 2", "position 3", "position 4", "position 5", "position 6",
|
|
188
|
-
"position 7", "position 8"])
|
|
189
|
-
# self.p_wheel_2.model()
|
|
190
|
-
# self.p_wheel_2.setEnabled(False)
|
|
191
|
-
self.p_wheel_2.setFixedWidth(120)
|
|
192
|
-
self.p_button = QPushButton("Go to Position")
|
|
193
|
-
self.p_button.setToolTip(
|
|
194
|
-
"When you press this button, the Wheel will start moving \n"
|
|
195
|
-
"to the position of the requested positions.\n"
|
|
196
|
-
)
|
|
197
|
-
self.p_button.setFixedWidth(150)
|
|
198
|
-
self.p_button.clicked.connect(self.go_to_wheels_position)
|
|
199
|
-
|
|
200
|
-
hposition.addWidget(wheel_label)
|
|
201
|
-
hposition.addWidget(self.p_wheel_1)
|
|
202
|
-
hposition.addWidget(self.p_wheel_2)
|
|
203
|
-
hposition.addWidget(self.p_button)
|
|
204
|
-
hposition.setAlignment(Qt.AlignTop)
|
|
205
|
-
|
|
206
|
-
### ATTENUATION WIDGET ###
|
|
207
|
-
|
|
208
|
-
htransmittance = QHBoxLayout()
|
|
209
|
-
t_label = QLabel("Set the wheels to attenuation: ")
|
|
210
|
-
|
|
211
|
-
self.attenuation = QComboBox()
|
|
212
|
-
self.attenuation.setCurrentIndex(-1)
|
|
213
|
-
self.attenuation.addItem("= Attenuation =")
|
|
214
|
-
self.attenuation.model().item(0).setEnabled(False)
|
|
215
|
-
self.attenuation.setFixedWidth(230)
|
|
216
|
-
|
|
217
|
-
self.t_button = QPushButton("Go to attenuation")
|
|
218
|
-
self.t_button.setToolTip(
|
|
219
|
-
"When you press this button, the Wheel will start moving \n"
|
|
220
|
-
"to the position of the requested attenuation.\n"
|
|
221
|
-
)
|
|
222
|
-
self.t_button.setFixedWidth(150)
|
|
223
|
-
self.t_button.clicked.connect(self.go_to_wheels_attenuation)
|
|
224
|
-
|
|
225
|
-
htransmittance.addWidget(t_label)
|
|
226
|
-
htransmittance.addWidget(self.attenuation)
|
|
227
|
-
htransmittance.addWidget(self.t_button)
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
htransmittance.setAlignment(Qt.AlignTop)
|
|
231
|
-
|
|
232
|
-
### JOG WIDGET ###
|
|
233
|
-
hjog = QHBoxLayout()
|
|
234
|
-
j_label = QLabel("Jog attenuation position:")
|
|
235
|
-
|
|
236
|
-
self.j_up_button = QToolButton()
|
|
237
|
-
self.j_up_button.setArrowType(Qt.RightArrow)
|
|
238
|
-
self.j_up_button.setToolTip("Jogs the Attenuation to the next upper level")
|
|
239
|
-
self.j_up_button.setObjectName("up")
|
|
240
|
-
self.j_up_button.setFixedWidth(35)
|
|
241
|
-
self.j_up_button.clicked.connect(self.att_level)
|
|
242
|
-
|
|
243
|
-
self.j_down_button = QToolButton()
|
|
244
|
-
self.j_down_button.setArrowType(Qt.LeftArrow)
|
|
245
|
-
self.j_down_button.setToolTip("Jogs the Attenuation to the next downer level")
|
|
246
|
-
self.j_down_button.setObjectName("down")
|
|
247
|
-
self.j_down_button.setFixedWidth(35)
|
|
248
|
-
self.j_down_button.clicked.connect(self.att_level)
|
|
249
|
-
|
|
250
|
-
hjog.addWidget(j_label)
|
|
251
|
-
hjog.addWidget(self.j_down_button)
|
|
252
|
-
hjog.setAlignment(Qt.AlignLeft)
|
|
253
|
-
hjog.addWidget(self.j_up_button)
|
|
254
|
-
hjog.setAlignment(Qt.AlignLeft)
|
|
255
|
-
hjog.setAlignment(Qt.AlignTop)
|
|
256
|
-
|
|
257
|
-
## PUTTING ALL TOGETHER ###
|
|
258
|
-
vbox.addLayout(hposition)
|
|
259
|
-
vbox.setSpacing(0)
|
|
260
|
-
vbox.addLayout(htransmittance)
|
|
261
|
-
vbox.addLayout(hjog)
|
|
262
|
-
vbox.setAlignment(Qt.AlignTop)
|
|
263
|
-
|
|
264
|
-
group_box = QGroupBox("Commands", self)
|
|
265
|
-
group_box.setLayout(vbox)
|
|
266
|
-
group_box.setFixedWidth(600)
|
|
267
|
-
return group_box
|
|
268
|
-
|
|
269
|
-
def createWheelStatusWidget(self):
|
|
270
|
-
|
|
271
|
-
group_box = QGroupBox("Eksma Filter Wheel Status")
|
|
272
|
-
|
|
273
|
-
# Create the label fields that display the current measure
|
|
274
|
-
|
|
275
|
-
vbox = QVBoxLayout()
|
|
276
|
-
|
|
277
|
-
# FILTERWHEEL STATUS ###
|
|
278
|
-
# HK Parameters from motor and wheels
|
|
279
|
-
vstatusbox = QVBoxLayout()
|
|
280
|
-
vstatusbox.setAlignment(Qt.AlignTop)
|
|
281
|
-
|
|
282
|
-
self.wheelstatus = [[QLabel("Position (steps):"), QLineEdit()],
|
|
283
|
-
[QLabel("Wheel speed:"), QLineEdit()],
|
|
284
|
-
[QLabel("Temperature (°C)"), QLineEdit()],
|
|
285
|
-
[QLabel("Engine Current (mA):"), QLineEdit()],
|
|
286
|
-
[QLabel("Power Supply voltage (V):"), QLineEdit()],
|
|
287
|
-
[QLabel("Status Flags:"), QLineEdit()]]
|
|
288
|
-
|
|
289
|
-
for elements in self.wheelstatus:
|
|
290
|
-
hstatus = QHBoxLayout()
|
|
291
|
-
hstatus.setSpacing(3)
|
|
292
|
-
# elements[0].setStyleSheet("QLabel { background-color : LightGray; }") --> here we see the widget policy
|
|
293
|
-
elements[0].setFixedWidth(210)
|
|
294
|
-
elements[1].setReadOnly(True)
|
|
295
|
-
elements[1].setFixedWidth(70)
|
|
296
|
-
hstatus.addWidget(elements[0])
|
|
297
|
-
hstatus.addWidget(elements[1])
|
|
298
|
-
|
|
299
|
-
vstatusbox.addLayout(hstatus)
|
|
300
|
-
|
|
301
|
-
## FLAGS WIDGET ##
|
|
302
|
-
vflagbox = QVBoxLayout()
|
|
303
|
-
|
|
304
|
-
self.wheel_flags = [[QLabel("Is homed"), QLed(self, offColour=QLed.Red, onColour=QLed.Green, shape=QLed.Square)],
|
|
305
|
-
[QLabel("Secur"), QLed(self, offColour=QLed.Green, onColour=QLed.Red, shape=QLed.Square)],
|
|
306
|
-
[QLabel("Alarm"), QLed(self, offColour=QLed.Green, onColour=QLed.Red, shape=QLed.Square)],
|
|
307
|
-
[QLabel("Error"), QLed(self, offColour=QLed.Green, onColour=QLed.Red, shape=QLed.Square)]]
|
|
308
|
-
|
|
309
|
-
for element in self.wheel_flags:
|
|
310
|
-
hflags = QHBoxLayout()
|
|
311
|
-
hflags.setSpacing(3)
|
|
312
|
-
element[1].setFixedSize(15, 15)
|
|
313
|
-
hflags.addWidget(element[1])
|
|
314
|
-
hflags.addWidget(element[0])
|
|
315
|
-
|
|
316
|
-
vflagbox.addLayout(hflags)
|
|
317
|
-
|
|
318
|
-
# vledbox = QVBoxLayout()
|
|
319
|
-
# hbox = QHBoxLayout()
|
|
320
|
-
# self.homing_led = QLed(self, offColour=QLed.Red, onColour=QLed.Green, shape=QLed.Square)
|
|
321
|
-
# self.homing_led.setFixedSize(15, 15)
|
|
322
|
-
#
|
|
323
|
-
# hbox.addWidget(self.homing_led)
|
|
324
|
-
# hbox.setAlignment(Qt.AlignTop)
|
|
325
|
-
#
|
|
326
|
-
# hbox.addWidget(QLabel("Is Homed"))
|
|
327
|
-
# hbox.setAlignment(Qt.AlignTop)
|
|
328
|
-
# hbox.setSpacing(5)
|
|
329
|
-
# vledbox.addLayout(hbox)
|
|
330
|
-
|
|
331
|
-
# ATTENUATION UNITS WIDGET
|
|
332
|
-
vattbox = QVBoxLayout()
|
|
333
|
-
vattbox.setAlignment(Qt.AlignTop)
|
|
334
|
-
|
|
335
|
-
att_label = QLabel("== ATTENUATION PARAMETERS ==")
|
|
336
|
-
|
|
337
|
-
vattbox.addWidget(att_label)
|
|
338
|
-
|
|
339
|
-
self.wheelconfiguration = [[QLabel("Actual wheel attenuation:"), QLineEdit()]]
|
|
340
|
-
for elements in self.wheelconfiguration:
|
|
341
|
-
hconf = QHBoxLayout()
|
|
342
|
-
hconf.setSpacing(3)
|
|
343
|
-
elements[0].setFixedWidth(210)
|
|
344
|
-
elements[1].setReadOnly(True)
|
|
345
|
-
elements[1].setFixedWidth(70)
|
|
346
|
-
hconf.addWidget(elements[0])
|
|
347
|
-
hconf.addWidget(elements[1])
|
|
348
|
-
|
|
349
|
-
vattbox.addLayout(hconf)
|
|
350
|
-
|
|
351
|
-
self.att_modes = [[QRadioButton("OD")],
|
|
352
|
-
[QRadioButton("Transmittance (%)")],
|
|
353
|
-
[QRadioButton("Irradiance (W/cm2)")],
|
|
354
|
-
[QRadioButton("Star Magnitude")]
|
|
355
|
-
]
|
|
356
|
-
for mode in self.att_modes:
|
|
357
|
-
mode[0].clicked.connect(self.set_mode)
|
|
358
|
-
vattbox.addWidget(mode[0])
|
|
359
|
-
|
|
360
|
-
vbox.addLayout(vstatusbox)
|
|
361
|
-
vbox.addLayout(vflagbox)
|
|
362
|
-
#vbox.addLayout(vledbox)
|
|
363
|
-
vbox.addLayout(vattbox)
|
|
364
|
-
|
|
365
|
-
group_box.setLayout(vbox)
|
|
366
|
-
group_box.setFixedWidth(290)
|
|
367
|
-
return group_box
|
|
368
|
-
|
|
369
|
-
def init_gui(self):
|
|
370
|
-
|
|
371
|
-
# Switch to using white background and black foreground for pyqtgraph stripcharts
|
|
372
|
-
|
|
373
|
-
pg.setConfigOption("background", "w")
|
|
374
|
-
pg.setConfigOption("foreground", "k")
|
|
375
|
-
|
|
376
|
-
# The main frame in which all the other frames are located, the outer Application frame
|
|
377
|
-
|
|
378
|
-
app_frame = QFrame()
|
|
379
|
-
app_frame.setObjectName("AppFrame")
|
|
380
|
-
|
|
381
|
-
self.wheel_1 = self.createWheelPositionWidget()
|
|
382
|
-
self.wheel_1.setTitle("Wheel 1")
|
|
383
|
-
self.wheel_2 = self.createWheelPositionWidget()
|
|
384
|
-
self.wheel_2.setTitle("Wheel 2")
|
|
385
|
-
|
|
386
|
-
self.wheel_control = self.createWheelControlWidget()
|
|
387
|
-
wheel_box = QVBoxLayout()
|
|
388
|
-
wheel_box.addWidget(self.wheel_1)
|
|
389
|
-
wheel_box.addWidget(self.wheel_2)
|
|
390
|
-
wheel_box.addWidget(self.wheel_control)
|
|
391
|
-
wheel_box.setSpacing(3)
|
|
392
|
-
|
|
393
|
-
hbox = QHBoxLayout()
|
|
394
|
-
self.createToolbar()
|
|
395
|
-
hbox.addWidget(self.createWheelStatusWidget())
|
|
396
|
-
hbox.addLayout(wheel_box)
|
|
397
|
-
|
|
398
|
-
app_frame.setLayout(hbox)
|
|
399
|
-
|
|
400
|
-
self.setCentralWidget(app_frame)
|
|
401
|
-
|
|
402
|
-
def set_style(self):
|
|
403
|
-
"""
|
|
404
|
-
Set the style for the LakeShoreUI Widget when it is connected to a real
|
|
405
|
-
LakeShore Controller (hardware).
|
|
406
|
-
This will override the styles that were defined in the styles.qss style file
|
|
407
|
-
that was loaded for the Application.
|
|
408
|
-
"""
|
|
409
|
-
self.setAutoFillBackground(True)
|
|
410
|
-
self.setBackgroundRole(QPalette.Light)
|
|
411
|
-
self.setStyleSheet(
|
|
412
|
-
"""
|
|
413
|
-
QGroupBox {
|
|
414
|
-
border: 1px solid lightGray;
|
|
415
|
-
border-radius: 0px;
|
|
416
|
-
margin-top: 0px;
|
|
417
|
-
padding-top: 10px;
|
|
418
|
-
}
|
|
419
|
-
QGroupBox::title {
|
|
420
|
-
background-color: transparent;
|
|
421
|
-
padding-top: 0px;
|
|
422
|
-
padding-left: 0px;
|
|
423
|
-
}
|
|
424
|
-
"""
|
|
425
|
-
)
|
|
426
|
-
|
|
427
|
-
def set_style_simulator(self):
|
|
428
|
-
"""
|
|
429
|
-
Set the style for the LakeShoreUI Widget when it is connected to a
|
|
430
|
-
LakeSHore Simulator.
|
|
431
|
-
This will override the styles that were defined in the styles.qss style file
|
|
432
|
-
that was loaded for the Application.
|
|
433
|
-
"""
|
|
434
|
-
self.setAutoFillBackground(True)
|
|
435
|
-
self.setBackgroundRole(QPalette.Dark)
|
|
436
|
-
self.setStyleSheet(
|
|
437
|
-
"""
|
|
438
|
-
QGroupBox {
|
|
439
|
-
border: 1px solid lightGray;
|
|
440
|
-
border-radius: 0px;
|
|
441
|
-
margin-top: 0px;
|
|
442
|
-
padding-top: 10px;
|
|
443
|
-
}
|
|
444
|
-
QGroupBox::title {
|
|
445
|
-
background-color: transparent;
|
|
446
|
-
padding-top: 0px;
|
|
447
|
-
padding-left: 0px;
|
|
448
|
-
}
|
|
449
|
-
"""
|
|
450
|
-
)
|
|
451
|
-
|
|
452
|
-
def onClick(self):
|
|
453
|
-
|
|
454
|
-
sender = self.sender()
|
|
455
|
-
|
|
456
|
-
MODULE_LOGGER.debug(f"sender.text() = {sender.text()}")
|
|
457
|
-
MODULE_LOGGER.debug(f"sender.isChecked() = {sender.isChecked()}")
|
|
458
|
-
|
|
459
|
-
self.notifyObservers(sender)
|
|
460
|
-
|
|
461
|
-
def set_mode(self):
|
|
462
|
-
#todo: convert attenuation values to the mode selected
|
|
463
|
-
print("new mode selected")
|
|
464
|
-
|
|
465
|
-
def set_connection_state(self, state):
|
|
466
|
-
|
|
467
|
-
if state == "connected":
|
|
468
|
-
self.reconnect_action.setChecked(True)
|
|
469
|
-
elif state == "disconnected":
|
|
470
|
-
self.reconnect_action.setChecked(False)
|
|
471
|
-
else:
|
|
472
|
-
raise UnknownStateError(
|
|
473
|
-
f"Unknown State ({state}), expected 'connected' or 'disconnected'."
|
|
474
|
-
)
|
|
475
|
-
|
|
476
|
-
def update_position(self, new_position):
|
|
477
|
-
#print(new_position)
|
|
478
|
-
## resetting to false:
|
|
479
|
-
self.wheel_1.findChildren(QLed)[new_position[0]].blockSignals(True) # Block signals just in case: to be removed if any other way is used to select the wheels position
|
|
480
|
-
for x in self.wheel_1.findChildren(QLed):
|
|
481
|
-
x.value = False
|
|
482
|
-
x.repaint() # this is now needed to update the QLed widget, depends on OS and pyqt versions
|
|
483
|
-
self.wheel_1.findChildren(QLed)[new_position[0]].value = True
|
|
484
|
-
self.wheel_1.findChildren(QLed)[new_position[0]].repaint() # this is now needed to update the QLed widget, depends on OS and pyqt versions
|
|
485
|
-
self.wheel_1.findChildren(QLed)[new_position[0]].blockSignals(False)
|
|
486
|
-
|
|
487
|
-
self.wheel_2.findChildren(QLed)[new_position[1]].blockSignals(True)
|
|
488
|
-
for x in self.wheel_2.findChildren(QLed):
|
|
489
|
-
x.value = False
|
|
490
|
-
x.repaint() # this is now needed to update the QLed widget, depends on OS and pyqt versions
|
|
491
|
-
self.wheel_2.findChildren(QLed)[new_position[1]].value = True
|
|
492
|
-
self.wheel_2.findChildren(QLed)[new_position[1]].repaint() # this is now needed to update the QLed widget, depends on OS and pyqt versions
|
|
493
|
-
self.wheel_2.findChildren(QLed)[new_position[1]].blockSignals(False)
|
|
494
|
-
|
|
495
|
-
self.update_attenuation_value()
|
|
496
|
-
|
|
497
|
-
def update_attenuations(self, levels):
|
|
498
|
-
## setting the wheel transmittances:
|
|
499
|
-
for elements in range(8):
|
|
500
|
-
self.wheel_1.findChildren(QLineEdit)[elements].setText(levels[0][elements])
|
|
501
|
-
self.wheel_2.findChildren(QLineEdit)[elements].setText(levels[1][elements])
|
|
502
|
-
|
|
503
|
-
def update_attenuation_value(self):
|
|
504
|
-
# boolean list of Qleds for each wheel:
|
|
505
|
-
att_pos1 = [i.value for i in self.wheel_1.findChildren(QLed)]
|
|
506
|
-
att_pos2 = [i.value for i in self.wheel_2.findChildren(QLed)]
|
|
507
|
-
|
|
508
|
-
# getting the required index from the position:
|
|
509
|
-
index1 = list(compress(range(len(att_pos1)), att_pos1))[0]
|
|
510
|
-
index2 = list(compress(range(len(att_pos2)), att_pos2))[0]
|
|
511
|
-
|
|
512
|
-
# Some indexes might not exist as they are lead to duplicated attenuation levels, that is why the ValueError
|
|
513
|
-
# is used
|
|
514
|
-
try:
|
|
515
|
-
att_index = self.attenuation_values[1].index([index1, index2]) + 1
|
|
516
|
-
|
|
517
|
-
except ValueError:
|
|
518
|
-
# Normally only numbers are thrown here:
|
|
519
|
-
att_1 = float(self.wheel_1.findChildren(QLineEdit)[index1].text())
|
|
520
|
-
att_2 = float(self.wheel_2.findChildren(QLineEdit)[index2].text())
|
|
521
|
-
att_index = self.attenuation_values[0].index(att_1 + att_2)
|
|
522
|
-
|
|
523
|
-
# updates attenuation combobox
|
|
524
|
-
self.attenuation.blockSignals(True)
|
|
525
|
-
self.attenuation.setCurrentIndex(att_index)
|
|
526
|
-
self.attenuation.repaint()
|
|
527
|
-
self.attenuation.blockSignals(False)
|
|
528
|
-
|
|
529
|
-
# updates attenuation value in the config widget
|
|
530
|
-
self.wheelconfiguration[0][1].setText(self.attenuation.currentText())
|
|
531
|
-
self.wheelconfiguration[0][1].repaint()
|
|
532
|
-
|
|
533
|
-
def initialize_position_values(self, init_values, levels):
|
|
534
|
-
pos_wheel_1 = init_values[0]
|
|
535
|
-
pos_wheel_2 = init_values[1]
|
|
536
|
-
|
|
537
|
-
# fixme: there is an issue here as the wheel might not be at (0,0) position on sw boot ...
|
|
538
|
-
# for the moment a warning message is sent on init
|
|
539
|
-
if self.wheel_flags[0][1].value == 0:
|
|
540
|
-
self.wheel_flags[0][1].setToolTip("Homing is needed")
|
|
541
|
-
for elements in range(8):
|
|
542
|
-
self.wheel_1.findChildren(QLineEdit)[elements].setText("None")
|
|
543
|
-
self.wheel_2.findChildren(QLineEdit)[elements].setText("None")
|
|
544
|
-
|
|
545
|
-
else:
|
|
546
|
-
if any(i !=0 for i in init_values):
|
|
547
|
-
description = "The filter wheel has been started in a non zero position."
|
|
548
|
-
info_text = (
|
|
549
|
-
"The GUI will start, but the initial position of the filter wheel might not be the real one."
|
|
550
|
-
"In order to correctly initialize the wheel, please do a homing command first "
|
|
551
|
-
"Otherwise, move both wheel 1 and wheel 2 to their zero position "
|
|
552
|
-
)
|
|
553
|
-
|
|
554
|
-
show_warning_message(description, info_text)
|
|
555
|
-
else:
|
|
556
|
-
# setting the initial wheel positions:
|
|
557
|
-
self.wheel_1.findChildren(QLed)[pos_wheel_1].blockSignals(
|
|
558
|
-
True) # Block signals just in case: to be removed if any other way is used to select the wheels position
|
|
559
|
-
self.wheel_1.findChildren(QLed)[pos_wheel_1].value = True
|
|
560
|
-
self.wheel_1.findChildren(QLed)[pos_wheel_1].blockSignals(False)
|
|
561
|
-
self.wheel_2.findChildren(QLed)[pos_wheel_2].blockSignals(True)
|
|
562
|
-
self.wheel_2.findChildren(QLed)[pos_wheel_2].value = True
|
|
563
|
-
self.wheel_2.findChildren(QLed)[pos_wheel_2].blockSignals(False)
|
|
564
|
-
|
|
565
|
-
self.update_attenuation_value()
|
|
566
|
-
|
|
567
|
-
self.wheel_flags[0][1].setToolTip("The wheel is calibrated, no homing needed")
|
|
568
|
-
|
|
569
|
-
# setting the wheel transmittances:
|
|
570
|
-
for elements in range(8):
|
|
571
|
-
self.wheel_1.findChildren(QLineEdit)[elements].setText(repr(levels[0][elements]))
|
|
572
|
-
self.wheel_2.findChildren(QLineEdit)[elements].setText(repr(levels[1][elements]))
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
def initialize_status_values(self, _status, s_flags):
|
|
577
|
-
# building status flags list:
|
|
578
|
-
sf = [s_flags["Is homed"], s_flags["Secur"], s_flags["Alarm"], 0]
|
|
579
|
-
|
|
580
|
-
# first we see if there are complicated errors:
|
|
581
|
-
error = [s_flags["Control"], s_flags["Err C"], s_flags["Err D"], s_flags["Err V"], s_flags["EEPROM Connected"],
|
|
582
|
-
s_flags["CTP error"], s_flags["Borders Swap Misset"], s_flags["H bridge fault"]]
|
|
583
|
-
|
|
584
|
-
if any(value == 1 for value in error):
|
|
585
|
-
sf[3] = 1
|
|
586
|
-
|
|
587
|
-
for i in range(len(_status)):
|
|
588
|
-
self.wheelstatus[i][1].setText(repr(_status[i]))
|
|
589
|
-
|
|
590
|
-
# update of the status flags:
|
|
591
|
-
for i in range(len(sf)):
|
|
592
|
-
self.wheel_flags[i][1].value = sf[i]
|
|
593
|
-
|
|
594
|
-
# checks if homing state changed thus goes to enable
|
|
595
|
-
|
|
596
|
-
if sf[0] == 0:
|
|
597
|
-
self.enable_control_layout()
|
|
598
|
-
else:
|
|
599
|
-
pass
|
|
600
|
-
|
|
601
|
-
def initialize_attenuator_values(self, value):
|
|
602
|
-
# Initializes the attenuator combobox from the Commanding widget
|
|
603
|
-
self.attenuation_values = value
|
|
604
|
-
_factors = self.attenuation_values[0]
|
|
605
|
-
_values = map(str, _factors)
|
|
606
|
-
self.attenuation.addItems(_values)
|
|
607
|
-
|
|
608
|
-
# Initializes the attenuator configuration spinbox from the status widget
|
|
609
|
-
self.att_modes[0][0].blockSignals(True)
|
|
610
|
-
self.att_modes[0][0].setChecked(True)
|
|
611
|
-
self.att_modes[0][0].blockSignals(False)
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
def enable_control_layout(self):
|
|
615
|
-
# Now we check homing from the new flags coming from the controller:
|
|
616
|
-
_homing = self.wheel_flags[0][1].value
|
|
617
|
-
for elements in self.wheel_control.findChildren(QComboBox):
|
|
618
|
-
elements.setEnabled(_homing)
|
|
619
|
-
for elements in self.wheel_control.findChildren(QToolButton):
|
|
620
|
-
elements.setEnabled(_homing)
|
|
621
|
-
for elements in self.wheel_control.findChildren(QPushButton):
|
|
622
|
-
elements.setEnabled(_homing)
|
|
623
|
-
|
|
624
|
-
def go_to_wheels_position(self):
|
|
625
|
-
new_position = [self.p_wheel_1.currentIndex() - 1, self.p_wheel_2.currentIndex() - 1]
|
|
626
|
-
if any(pos < 0 for pos in new_position):
|
|
627
|
-
MODULE_LOGGER.warning("Please select a position for each of the filter wheels")
|
|
628
|
-
else:
|
|
629
|
-
self.actionObservers({"set_position": new_position})
|
|
630
|
-
|
|
631
|
-
def go_to_wheels_attenuation(self):
|
|
632
|
-
# takes the index value of transmittance, calculates the wheels position and moves the wheels to the position.
|
|
633
|
-
t_value = self.attenuation.currentIndex()
|
|
634
|
-
if t_value == 0:
|
|
635
|
-
MODULE_LOGGER.warning("Please select an attenuation from the combo box")
|
|
636
|
-
else:
|
|
637
|
-
index = self.attenuation_values[1]
|
|
638
|
-
index = index[t_value-1]
|
|
639
|
-
self.actionObservers({"set_position": index})
|
|
640
|
-
|
|
641
|
-
def att_level(self):
|
|
642
|
-
sender = self.sender()
|
|
643
|
-
object_name = sender.objectName()
|
|
644
|
-
self.actionObservers({"att_level": object_name})
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
class FilterWheelUIModel:
|
|
648
|
-
def __init__(self, type_):
|
|
649
|
-
self.type = type_
|
|
650
|
-
|
|
651
|
-
if self.type == "proxy":
|
|
652
|
-
self.fw = FilterWheel8SMC4Proxy()
|
|
653
|
-
elif self.type == "direct":
|
|
654
|
-
self.fw = FilterWheel8SMC4Controller()
|
|
655
|
-
self.fw.connect()
|
|
656
|
-
elif self.type == "simulator":
|
|
657
|
-
self.fw = FilterWheel8SMC4Simulator()
|
|
658
|
-
else:
|
|
659
|
-
raise Exception(
|
|
660
|
-
f"Unknown type of Filter Wheel implementation passed into the model: {type}"
|
|
661
|
-
)
|
|
662
|
-
if self.fw is not None:
|
|
663
|
-
MODULE_LOGGER.debug(
|
|
664
|
-
f"FilterWheel8SMC4Controller initialized as {self.fw.__class__.__name__}"
|
|
665
|
-
)
|
|
666
|
-
|
|
667
|
-
def has_commands(self):
|
|
668
|
-
if self.type == "proxy":
|
|
669
|
-
return self.fw.has_commands()
|
|
670
|
-
return True
|
|
671
|
-
|
|
672
|
-
def load_commands(self):
|
|
673
|
-
if self.type == "proxy":
|
|
674
|
-
self.fw.load_commands()
|
|
675
|
-
|
|
676
|
-
def is_simulator(self):
|
|
677
|
-
return self.fw.is_simulator()
|
|
678
|
-
|
|
679
|
-
def is_connected(self):
|
|
680
|
-
if self.type == "proxy":
|
|
681
|
-
return self.fw.is_cs_connected()
|
|
682
|
-
else:
|
|
683
|
-
return self.fw.is_connected()
|
|
684
|
-
|
|
685
|
-
def reconnect(self):
|
|
686
|
-
# I need a better insight in what could be wrong and how to reconnect
|
|
687
|
-
# This is probably also dependent on Proxy or other Hexapod implementation
|
|
688
|
-
|
|
689
|
-
if self.type == "proxy":
|
|
690
|
-
self.fw.reconnect_cs()
|
|
691
|
-
return self.fw.is_cs_connected()
|
|
692
|
-
else:
|
|
693
|
-
self.fw.reconnect()
|
|
694
|
-
return self.fw.is_connected()
|
|
695
|
-
return False
|
|
696
|
-
|
|
697
|
-
def disconnect(self):
|
|
698
|
-
if self.type == "proxy":
|
|
699
|
-
self.fw.disconnect_cs()
|
|
700
|
-
else:
|
|
701
|
-
self.fw.disconnect()
|
|
702
|
-
|
|
703
|
-
def load_wheels(self):
|
|
704
|
-
_setup = self.fw.load_wheels()
|
|
705
|
-
|
|
706
|
-
def homing(self):
|
|
707
|
-
self.fw.homing()
|
|
708
|
-
|
|
709
|
-
def get_position(self):
|
|
710
|
-
position = self.fw.get_position()
|
|
711
|
-
return position
|
|
712
|
-
|
|
713
|
-
def set_position(self, pos_wheel1, pos_wheel2):
|
|
714
|
-
_output = self.fw.set_position(pos_wheel1, pos_wheel2)
|
|
715
|
-
return _output
|
|
716
|
-
|
|
717
|
-
def get_status(self):
|
|
718
|
-
return self.fw.get_status()
|
|
719
|
-
|
|
720
|
-
def wheel_factors(self):
|
|
721
|
-
return self.fw.wheel_factors()
|
|
722
|
-
|
|
723
|
-
def att_get_level(self):
|
|
724
|
-
return self.fw.att_get_level()
|
|
725
|
-
|
|
726
|
-
def att_level_up(self):
|
|
727
|
-
_position = self.fw.att_level_up()
|
|
728
|
-
return _position
|
|
729
|
-
|
|
730
|
-
def att_level_down(self):
|
|
731
|
-
_position = self.fw.att_level_down()
|
|
732
|
-
return _position
|
|
733
|
-
|
|
734
|
-
def att_status(self, _flags):
|
|
735
|
-
s_flags = self.fw.att_status(_flags)
|
|
736
|
-
return s_flags
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
class FilterWheelUIController(Observer):
|
|
740
|
-
def __init__(self, model, view):
|
|
741
|
-
self.model = model
|
|
742
|
-
self.view = view
|
|
743
|
-
self.view.addObserver(self)
|
|
744
|
-
self.create_timer()
|
|
745
|
-
|
|
746
|
-
if self.model.is_connected():
|
|
747
|
-
self.initialize_status_values()
|
|
748
|
-
self.initialize_attenuator_values()
|
|
749
|
-
self.initialize_position_values()
|
|
750
|
-
#self.enable_control_layout()
|
|
751
|
-
|
|
752
|
-
if self.model.is_simulator():
|
|
753
|
-
self.view.set_style_simulator()
|
|
754
|
-
else:
|
|
755
|
-
self.view.set_style()
|
|
756
|
-
|
|
757
|
-
self.view.set_connection_state("connected")
|
|
758
|
-
self.start_timer()
|
|
759
|
-
else:
|
|
760
|
-
self.stop_timer()
|
|
761
|
-
self.view.set_connection_state("disconnected")
|
|
762
|
-
|
|
763
|
-
def create_timer(self):
|
|
764
|
-
"""Create a Timer that will update the States every second."""
|
|
765
|
-
|
|
766
|
-
self.states_capture_timer = QTimer()
|
|
767
|
-
|
|
768
|
-
self.states_capture_timer.timeout.connect(self.update_status_values)
|
|
769
|
-
self.states_capture_timer.setInterval(200)
|
|
770
|
-
|
|
771
|
-
def start_timer(self):
|
|
772
|
-
self.states_capture_timer.start()
|
|
773
|
-
|
|
774
|
-
def stop_timer(self):
|
|
775
|
-
self.states_capture_timer.stop()
|
|
776
|
-
|
|
777
|
-
def update(self, changed_object):
|
|
778
|
-
|
|
779
|
-
text = changed_object.text()
|
|
780
|
-
|
|
781
|
-
if text == "Reconnect":
|
|
782
|
-
|
|
783
|
-
if changed_object.isChecked():
|
|
784
|
-
MODULE_LOGGER.debug("Reconnecting the Filter Wheel model.")
|
|
785
|
-
if self.model.reconnect():
|
|
786
|
-
self.view.set_connection_state("connected")
|
|
787
|
-
if not self.model.has_commands():
|
|
788
|
-
self.model.load_commands()
|
|
789
|
-
self.start_timer()
|
|
790
|
-
else:
|
|
791
|
-
self.view.reconnect_action.setChecked(False)
|
|
792
|
-
else:
|
|
793
|
-
MODULE_LOGGER.debug("Disconnecting the Filter Wheel model.")
|
|
794
|
-
self.stop_timer()
|
|
795
|
-
self.model.disconnect()
|
|
796
|
-
self.view.set_connection_state("disconnected")
|
|
797
|
-
|
|
798
|
-
return
|
|
799
|
-
|
|
800
|
-
if text == "Homing":
|
|
801
|
-
MODULE_LOGGER.debug("Trying to perform homing to calibrate the Filter Wheel position")
|
|
802
|
-
self.model.homing()
|
|
803
|
-
self.initialize_position_values()
|
|
804
|
-
self.enable_control_layout()
|
|
805
|
-
|
|
806
|
-
if text == "ClearErrors":
|
|
807
|
-
self.model.clearError()
|
|
808
|
-
|
|
809
|
-
if text == "Reset":
|
|
810
|
-
pass
|
|
811
|
-
|
|
812
|
-
def update_status_values(self):
|
|
813
|
-
_status = self.model.get_status()
|
|
814
|
-
s_flags = self.model.att_status(_status[5])
|
|
815
|
-
self.view.initialize_status_values(_status, s_flags)
|
|
816
|
-
|
|
817
|
-
def do(self, actions):
|
|
818
|
-
|
|
819
|
-
for action, value in actions.items():
|
|
820
|
-
MODULE_LOGGER.debug(f"do {action} with {value}")
|
|
821
|
-
if action == "set_position":
|
|
822
|
-
position = value
|
|
823
|
-
MODULE_LOGGER.debug(
|
|
824
|
-
f"do: set_position({position[0]}:{type(position[0])}, {position[1]}:{type(position[1])})")
|
|
825
|
-
_ouput = self.model.set_position(position[0], position[1])
|
|
826
|
-
# fake change of the position value: if set_position is OK then we assume the position is correct
|
|
827
|
-
self.view.update_position(position)
|
|
828
|
-
|
|
829
|
-
if action == "att_level":
|
|
830
|
-
jog = value
|
|
831
|
-
MODULE_LOGGER.debug(f"do: att_level_up({jog}):{type(jog)}")
|
|
832
|
-
if jog == "up":
|
|
833
|
-
position = self.model.att_level_up()
|
|
834
|
-
elif jog == "down":
|
|
835
|
-
position = self.model.att_level_down()
|
|
836
|
-
else:
|
|
837
|
-
MODULE_LOGGER.warning("Something went wrong when trying to move the wheel")
|
|
838
|
-
self.view.update_position(position)
|
|
839
|
-
|
|
840
|
-
def initialize_position_values(self):
|
|
841
|
-
init_position = self.model.get_position()
|
|
842
|
-
levels = self.model.att_get_level()
|
|
843
|
-
self.view.initialize_position_values(init_position, levels)
|
|
844
|
-
|
|
845
|
-
def initialize_status_values(self):
|
|
846
|
-
_status = self.model.get_status()
|
|
847
|
-
s_flags = self.model.att_status(_status[5])
|
|
848
|
-
self.view.initialize_status_values(_status, s_flags)
|
|
849
|
-
|
|
850
|
-
def initialize_attenuator_values(self):
|
|
851
|
-
self.model.load_wheels()
|
|
852
|
-
|
|
853
|
-
_factors = self.model.wheel_factors()
|
|
854
|
-
self.view.initialize_attenuator_values(_factors)
|
|
855
|
-
|
|
856
|
-
def enable_control_layout(self):
|
|
857
|
-
self.view.enable_control_layout()
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
def parse_arguments():
|
|
861
|
-
"""
|
|
862
|
-
Prepare the arguments that are specific for this application.
|
|
863
|
-
"""
|
|
864
|
-
parser = argparse.ArgumentParser()
|
|
865
|
-
parser.add_argument(
|
|
866
|
-
"--type",
|
|
867
|
-
dest="type",
|
|
868
|
-
action="store",
|
|
869
|
-
choices={"proxy", "simulator", "direct"},
|
|
870
|
-
help="Specify the implementation you want to connect to.",
|
|
871
|
-
default="proxy",
|
|
872
|
-
)
|
|
873
|
-
parser.add_argument(
|
|
874
|
-
"--profile",
|
|
875
|
-
default=False,
|
|
876
|
-
action="store_true",
|
|
877
|
-
help="Enable info logging messages with method profile information.",
|
|
878
|
-
)
|
|
879
|
-
args = parser.parse_args()
|
|
880
|
-
return args
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
def main():
|
|
884
|
-
|
|
885
|
-
lock_file = QLockFile(str(Path("~/fw8scm4_ui.app.lock").expanduser()))
|
|
886
|
-
|
|
887
|
-
STYLES_LOCATION = find_file("styles.qss", in_dir="egse/gui")
|
|
888
|
-
|
|
889
|
-
args = list(sys.argv)
|
|
890
|
-
args[1:1] = ["-stylesheet", str(STYLES_LOCATION)]
|
|
891
|
-
|
|
892
|
-
app = QApplication(args)
|
|
893
|
-
app.setWindowIcon(QIcon(str(get_resource(":/icons/color-scheme.svg"))))
|
|
894
|
-
|
|
895
|
-
if lock_file.tryLock(100):
|
|
896
|
-
|
|
897
|
-
process_status = ProcessStatus()
|
|
898
|
-
|
|
899
|
-
timer_thread = threading.Thread(target=do_every, args=(10, process_status.update))
|
|
900
|
-
timer_thread.daemon = True
|
|
901
|
-
timer_thread.start()
|
|
902
|
-
|
|
903
|
-
start_http_server(GUI_SETTINGS.METRICS_PORT)
|
|
904
|
-
|
|
905
|
-
args = parse_arguments()
|
|
906
|
-
|
|
907
|
-
if args.profile:
|
|
908
|
-
Settings.set_profiling(True)
|
|
909
|
-
|
|
910
|
-
if args.type == "proxy":
|
|
911
|
-
proxy = FilterWheel8SMC4Proxy()
|
|
912
|
-
if not proxy.ping():
|
|
913
|
-
description = "Could not connect to Filter Wheel Control Server"
|
|
914
|
-
info_text = (
|
|
915
|
-
"The GUI will start, but the connection button will show a disconnected state. "
|
|
916
|
-
"Please check if the Control Server is running and start the server if needed. "
|
|
917
|
-
"Otherwise, check if the correct HOSTNAME for the control server is set in the "
|
|
918
|
-
"Settings.yaml "
|
|
919
|
-
"configuration file."
|
|
920
|
-
)
|
|
921
|
-
|
|
922
|
-
show_warning_message(description, info_text)
|
|
923
|
-
|
|
924
|
-
view = FilterWheelUIView()
|
|
925
|
-
model = FilterWheelUIModel(args.type)
|
|
926
|
-
controller = FilterWheelUIController(model, view)
|
|
927
|
-
|
|
928
|
-
view.show()
|
|
929
|
-
return app.exec_()
|
|
930
|
-
else:
|
|
931
|
-
error_message = QMessageBox()
|
|
932
|
-
error_message.setIcon(QMessageBox.Warning)
|
|
933
|
-
error_message.setWindowTitle("Error")
|
|
934
|
-
error_message.setText("The FW8SMC4 GUI application is already running!")
|
|
935
|
-
error_message.setStandardButtons(QMessageBox.Ok)
|
|
936
|
-
|
|
937
|
-
return error_message.exec()
|
|
938
|
-
|
|
939
|
-
if __name__ == "__main__":
|
|
940
|
-
sys.exit(main())
|