cgse 2024.7.0__py3-none-any.whl → 2025.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- README.md +27 -0
- bump.py +85 -0
- cgse-2025.0.2.dist-info/METADATA +38 -0
- cgse-2025.0.2.dist-info/RECORD +5 -0
- {cgse-2024.7.0.dist-info → cgse-2025.0.2.dist-info}/WHEEL +1 -2
- cgse-2024.7.0.dist-info/COPYING +0 -674
- cgse-2024.7.0.dist-info/COPYING.LESSER +0 -165
- cgse-2024.7.0.dist-info/METADATA +0 -144
- cgse-2024.7.0.dist-info/RECORD +0 -660
- cgse-2024.7.0.dist-info/entry_points.txt +0 -75
- cgse-2024.7.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5238
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -627
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -903
- egse/aeu/aeu_metrics.py +0 -131
- egse/aeu/aeu_protocol.py +0 -463
- egse/aeu/aeu_psu.yaml +0 -204
- egse/aeu/aeu_ui.py +0 -873
- egse/aeu/arbdata/FccdRead.arb +0 -2
- egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
- egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/ccdRead25.arb +0 -2
- egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead50.arb +0 -2
- egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
- egse/alert/__init__.py +0 -1049
- egse/alert/alertman.yaml +0 -37
- egse/alert/alertman_cs.py +0 -233
- egse/alert/alertman_ui.py +0 -600
- egse/alert/gsm/beaglebone.py +0 -138
- egse/alert/gsm/beaglebone.yaml +0 -51
- egse/alert/gsm/beaglebone_cs.py +0 -108
- egse/alert/gsm/beaglebone_devif.py +0 -122
- egse/alert/gsm/beaglebone_protocol.py +0 -46
- egse/bits.py +0 -318
- egse/camera.py +0 -44
- egse/collimator/__init__.py +0 -0
- egse/collimator/fcul/__init__.py +0 -0
- egse/collimator/fcul/ogse.py +0 -1077
- egse/collimator/fcul/ogse.yaml +0 -14
- egse/collimator/fcul/ogse_cs.py +0 -154
- egse/collimator/fcul/ogse_devif.py +0 -358
- egse/collimator/fcul/ogse_protocol.py +0 -132
- egse/collimator/fcul/ogse_sim.py +0 -431
- egse/collimator/fcul/ogse_ui.py +0 -1108
- egse/command.py +0 -699
- egse/config.py +0 -410
- egse/confman/__init__.py +0 -1058
- egse/confman/confman.yaml +0 -70
- egse/confman/confman_cs.py +0 -240
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -632
- egse/coordinates/__init__.py +0 -534
- egse/coordinates/avoidance.py +0 -100
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -122
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -194
- egse/coordinates/referenceFrame.py +0 -1279
- egse/coordinates/refmodel.py +0 -737
- egse/coordinates/rotationMatrix.py +0 -85
- egse/coordinates/transform3d_addon.py +0 -419
- egse/csl/__init__.py +0 -50
- egse/csl/commanding.py +0 -78
- egse/csl/icons/hexapod-connected-selected.svg +0 -30
- egse/csl/icons/hexapod-connected.svg +0 -30
- egse/csl/icons/hexapod-homing-selected.svg +0 -68
- egse/csl/icons/hexapod-homing.svg +0 -68
- egse/csl/icons/hexapod-retract-selected.svg +0 -56
- egse/csl/icons/hexapod-retract.svg +0 -51
- egse/csl/icons/hexapod-zero-selected.svg +0 -56
- egse/csl/icons/hexapod-zero.svg +0 -56
- egse/csl/icons/logo-puna.svg +0 -92
- egse/csl/icons/stop.svg +0 -1
- egse/csl/initialisation.py +0 -102
- egse/csl/mech_pos_settings.yaml +0 -18
- egse/das.py +0 -1240
- egse/das.yaml +0 -7
- egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
- egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
- egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
- egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
- egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
- egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
- egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
- egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
- egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
- egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
- egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
- egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
- egse/decorators.py +0 -514
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2698
- egse/dpu/ccd_ui.py +0 -514
- egse/dpu/dpu.py +0 -783
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -671
- egse/dpu/fitsgen.py +0 -2096
- egse/dpu/fitsgen_ui.py +0 -399
- egse/dpu/hdf5_model.py +0 -332
- egse/dpu/hdf5_ui.py +0 -277
- egse/dpu/hdf5_viewer.py +0 -506
- egse/dpu/hk_ui.py +0 -468
- egse/dpu_commands.py +0 -81
- egse/dsi/__init__.py +0 -33
- egse/dsi/_libesl.py +0 -232
- egse/dsi/constants.py +0 -296
- egse/dsi/esl.py +0 -630
- egse/dsi/rmap.py +0 -444
- egse/dsi/rmapci.py +0 -39
- egse/dsi/spw.py +0 -335
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -318
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -26
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -37
- egse/fdir/fdir_manager_controller.py +0 -136
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -15
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -30
- egse/fdir/fdir_remote_controller.py +0 -30
- egse/fdir/fdir_remote_cs.py +0 -94
- egse/fdir/fdir_remote_interface.py +0 -9
- egse/fdir/fdir_remote_popup.py +0 -26
- egse/fee/__init__.py +0 -106
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/feesim.py +0 -914
- egse/fee/n_fee_hk.py +0 -768
- egse/fee/nfee.py +0 -188
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -49
- egse/filterwheel/eksma/fw8smc4.py +0 -657
- egse/filterwheel/eksma/fw8smc4.yaml +0 -121
- egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
- egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
- egse/filterwheel/eksma/fw8smc4_protocol.py +0 -82
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -115
- egse/filterwheel/eksma/fw8smc5.yaml +0 -105
- egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
- egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
- egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
- egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
- egse/filterwheel/eksma/fw8smc5_ui.py +0 -1065
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -710
- egse/fov/fov_ui.py +0 -859
- egse/fov/fov_ui_controller.py +0 -140
- egse/fov/fov_ui_model.py +0 -200
- egse/fov/fov_ui_view.py +0 -345
- egse/gimbal/__init__.py +0 -32
- egse/gimbal/symetrie/__init__.py +0 -26
- egse/gimbal/symetrie/alpha.py +0 -586
- egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
- egse/gimbal/symetrie/gimbal.py +0 -877
- egse/gimbal/symetrie/gimbal.yaml +0 -168
- egse/gimbal/symetrie/gimbal_cs.py +0 -183
- egse/gimbal/symetrie/gimbal_protocol.py +0 -138
- egse/gimbal/symetrie/gimbal_ui.py +0 -361
- egse/gimbal/symetrie/pmac.py +0 -1006
- egse/gimbal/symetrie/pmac_regex.py +0 -83
- egse/graph.py +0 -132
- egse/gui/__init__.py +0 -47
- egse/gui/buttons.py +0 -378
- egse/gui/focalplane.py +0 -1285
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -587
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- egse/gui/styles.qss +0 -48
- egse/gui/switch.py +0 -112
- egse/h5.py +0 -274
- egse/help/__init__.py +0 -0
- egse/help/help_ui.py +0 -126
- egse/hexapod/__init__.py +0 -32
- egse/hexapod/symetrie/__init__.py +0 -137
- egse/hexapod/symetrie/alpha.py +0 -874
- egse/hexapod/symetrie/dynalpha.py +0 -1387
- egse/hexapod/symetrie/hexapod_ui.py +0 -1516
- egse/hexapod/symetrie/pmac.py +0 -1010
- egse/hexapod/symetrie/pmac_regex.py +0 -83
- egse/hexapod/symetrie/puna.py +0 -1167
- egse/hexapod/symetrie/puna.yaml +0 -193
- egse/hexapod/symetrie/puna_cs.py +0 -195
- egse/hexapod/symetrie/puna_protocol.py +0 -134
- egse/hexapod/symetrie/puna_ui.py +0 -433
- egse/hexapod/symetrie/punaplus.py +0 -107
- egse/hexapod/symetrie/zonda.py +0 -872
- egse/hexapod/symetrie/zonda.yaml +0 -337
- egse/hexapod/symetrie/zonda_cs.py +0 -172
- egse/hexapod/symetrie/zonda_devif.py +0 -414
- egse/hexapod/symetrie/zonda_protocol.py +0 -123
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -791
- egse/icons/aeu-cs-start.svg +0 -117
- egse/icons/aeu-cs-stop.svg +0 -118
- egse/icons/aeu-cs.svg +0 -107
- egse/icons/aeu_cs-started.svg +0 -112
- egse/icons/aeu_cs-stopped.svg +0 -112
- egse/icons/aeu_cs.svg +0 -55
- egse/icons/alert.svg +0 -1
- egse/icons/arrow-double-left.png +0 -0
- egse/icons/arrow-double-right.png +0 -0
- egse/icons/arrow-up.svg +0 -11
- egse/icons/backward.svg +0 -1
- egse/icons/busy.svg +0 -1
- egse/icons/cleaning.svg +0 -115
- egse/icons/color-scheme.svg +0 -1
- egse/icons/cs-connected-alert.svg +0 -91
- egse/icons/cs-connected-disabled.svg +0 -43
- egse/icons/cs-connected.svg +0 -89
- egse/icons/cs-not-connected.svg +0 -44
- egse/icons/double-left-arrow.svg +0 -1
- egse/icons/double-right-arrow.svg +0 -1
- egse/icons/erase-disabled.svg +0 -19
- egse/icons/erase.svg +0 -59
- egse/icons/fitsgen-start.svg +0 -47
- egse/icons/fitsgen-stop.svg +0 -48
- egse/icons/fitsgen.svg +0 -1
- egse/icons/forward.svg +0 -1
- egse/icons/fov-hk-start.svg +0 -33
- egse/icons/fov-hk-stop.svg +0 -37
- egse/icons/fov-hk.svg +0 -1
- egse/icons/front-desk.svg +0 -1
- egse/icons/home-actioned.svg +0 -15
- egse/icons/home-disabled.svg +0 -15
- egse/icons/home.svg +0 -13
- egse/icons/info.svg +0 -1
- egse/icons/invalid.png +0 -0
- egse/icons/led-green.svg +0 -20
- egse/icons/led-grey.svg +0 -20
- egse/icons/led-orange.svg +0 -20
- egse/icons/led-red.svg +0 -20
- egse/icons/led-square-green.svg +0 -134
- egse/icons/led-square-grey.svg +0 -134
- egse/icons/led-square-orange.svg +0 -134
- egse/icons/led-square-red.svg +0 -134
- egse/icons/limit-switch-all-green.svg +0 -115
- egse/icons/limit-switch-all-red.svg +0 -117
- egse/icons/limit-switch-el+.svg +0 -116
- egse/icons/limit-switch-el-.svg +0 -117
- egse/icons/location-marker.svg +0 -1
- egse/icons/logo-dpu.svg +0 -48
- egse/icons/logo-gimbal.svg +0 -112
- egse/icons/logo-huber.svg +0 -23
- egse/icons/logo-ogse.svg +0 -31
- egse/icons/logo-puna.svg +0 -92
- egse/icons/logo-tcs.svg +0 -29
- egse/icons/logo-zonda.svg +0 -66
- egse/icons/maximize.svg +0 -1
- egse/icons/meter.svg +0 -1
- egse/icons/more.svg +0 -45
- egse/icons/n-fee-hk-start.svg +0 -24
- egse/icons/n-fee-hk-stop.svg +0 -25
- egse/icons/n-fee-hk.svg +0 -83
- egse/icons/observing-off.svg +0 -46
- egse/icons/observing-on.svg +0 -46
- egse/icons/open-document-hdf5.png +0 -0
- egse/icons/open-document-hdf5.svg +0 -21
- egse/icons/ops-mode.svg +0 -1
- egse/icons/play-green.svg +0 -17
- egse/icons/plugged-disabled.svg +0 -27
- egse/icons/plugged.svg +0 -21
- egse/icons/pm_ui.svg +0 -1
- egse/icons/power-button-green.svg +0 -27
- egse/icons/power-button-red.svg +0 -27
- egse/icons/power-button.svg +0 -27
- egse/icons/radar.svg +0 -1
- egse/icons/radioactive.svg +0 -2
- egse/icons/reload.svg +0 -1
- egse/icons/remote-control-off.svg +0 -28
- egse/icons/remote-control-on.svg +0 -28
- egse/icons/repeat-blue.svg +0 -15
- egse/icons/repeat.svg +0 -1
- egse/icons/settings.svg +0 -1
- egse/icons/shrink.svg +0 -1
- egse/icons/shutter.svg +0 -1
- egse/icons/sign-off.svg +0 -1
- egse/icons/sign-on.svg +0 -1
- egse/icons/sim-mode.svg +0 -1
- egse/icons/small-buttons-go.svg +0 -20
- egse/icons/small-buttons-minus.svg +0 -51
- egse/icons/small-buttons-plus.svg +0 -51
- egse/icons/sponge.svg +0 -220
- egse/icons/start-button-disabled.svg +0 -84
- egse/icons/start-button.svg +0 -50
- egse/icons/stop-button-disabled.svg +0 -84
- egse/icons/stop-button.svg +0 -50
- egse/icons/stop-red.svg +0 -17
- egse/icons/stop.svg +0 -1
- egse/icons/switch-disabled-square.svg +0 -87
- egse/icons/switch-disabled.svg +0 -15
- egse/icons/switch-off-square.svg +0 -87
- egse/icons/switch-off.svg +0 -72
- egse/icons/switch-on-square.svg +0 -87
- egse/icons/switch-on.svg +0 -61
- egse/icons/temperature-control.svg +0 -44
- egse/icons/th_ui_logo.svg +0 -1
- egse/icons/unplugged.svg +0 -23
- egse/icons/unvalid.png +0 -0
- egse/icons/user-interface.svg +0 -1
- egse/icons/vacuum.svg +0 -1
- egse/icons/valid.png +0 -0
- egse/icons/zoom-to-pixel-dark.svg +0 -64
- egse/icons/zoom-to-pixel-white.svg +0 -36
- egse/images/big-rotation-stage.png +0 -0
- egse/images/connected-100.png +0 -0
- egse/images/cross.svg +0 -6
- egse/images/disconnected-100.png +0 -0
- egse/images/gui-icon.png +0 -0
- egse/images/home.svg +0 -6
- egse/images/info-icon.png +0 -0
- egse/images/led-black.svg +0 -89
- egse/images/led-green.svg +0 -85
- egse/images/led-orange.svg +0 -85
- egse/images/led-red.svg +0 -85
- egse/images/load-icon.png +0 -0
- egse/images/load-setup.png +0 -0
- egse/images/load.png +0 -0
- egse/images/pause.png +0 -0
- egse/images/play-button.svg +0 -8
- egse/images/play.png +0 -0
- egse/images/process-status.png +0 -0
- egse/images/restart.png +0 -0
- egse/images/search.png +0 -0
- egse/images/sma.png +0 -0
- egse/images/start.png +0 -0
- egse/images/stop-button.svg +0 -8
- egse/images/stop.png +0 -0
- egse/images/switch-off.svg +0 -48
- egse/images/switch-on.svg +0 -48
- egse/images/undo.png +0 -0
- egse/images/update-button.svg +0 -11
- egse/imageviewer/exposureselection.py +0 -475
- egse/imageviewer/imageviewer.py +0 -198
- egse/imageviewer/matchfocalplane.py +0 -179
- egse/imageviewer/subfieldposition.py +0 -133
- egse/lampcontrol/__init__.py +0 -4
- egse/lampcontrol/beaglebone/beaglebone.py +0 -178
- egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
- egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
- egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
- egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
- egse/lampcontrol/energetiq/__init__.py +0 -22
- egse/lampcontrol/energetiq/eq99.yaml +0 -98
- egse/lampcontrol/energetiq/lampEQ99.py +0 -283
- egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
- egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
- egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
- egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -71
- egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
- egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
- egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
- egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
- egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
- egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
- egse/lib/ximc/libximc.framework/libbindy.so +0 -0
- egse/lib/ximc/libximc.framework/libximc +0 -0
- egse/lib/ximc/libximc.framework/libximc.so +0 -0
- egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
- egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
- egse/lib/ximc/pyximc.py +0 -922
- egse/listener.py +0 -179
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -102
- egse/mixin.py +0 -464
- egse/monitoring.py +0 -95
- egse/ni/alarms/__init__.py +0 -26
- egse/ni/alarms/cdaq9375.py +0 -300
- egse/ni/alarms/cdaq9375.yaml +0 -89
- egse/ni/alarms/cdaq9375_cs.py +0 -130
- egse/ni/alarms/cdaq9375_devif.py +0 -183
- egse/ni/alarms/cdaq9375_protocol.py +0 -48
- egse/obs_inspection.py +0 -165
- egse/observer.py +0 -41
- egse/obsid.py +0 -163
- egse/powermeter/__init__.py +0 -0
- egse/powermeter/ni/__init__.py +0 -38
- egse/powermeter/ni/cdaq9184.py +0 -224
- egse/powermeter/ni/cdaq9184.yaml +0 -73
- egse/powermeter/ni/cdaq9184_cs.py +0 -130
- egse/powermeter/ni/cdaq9184_devif.py +0 -201
- egse/powermeter/ni/cdaq9184_protocol.py +0 -48
- egse/powermeter/ni/cdaq9184_ui.py +0 -544
- egse/powermeter/thorlabs/__init__.py +0 -25
- egse/powermeter/thorlabs/pm100a.py +0 -380
- egse/powermeter/thorlabs/pm100a.yaml +0 -132
- egse/powermeter/thorlabs/pm100a_cs.py +0 -136
- egse/powermeter/thorlabs/pm100a_devif.py +0 -127
- egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
- egse/powermeter/thorlabs/pm100a_ui.py +0 -725
- egse/process.py +0 -451
- egse/procman/__init__.py +0 -834
- egse/procman/cannot_start_process_popup.py +0 -43
- egse/procman/procman.yaml +0 -49
- egse/procman/procman_cs.py +0 -201
- egse/procman/procman_ui.py +0 -2081
- egse/protocol.py +0 -605
- egse/proxy.py +0 -531
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -693
- egse/resource.py +0 -333
- egse/rmap.py +0 -406
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -247
- egse/services.yaml +0 -68
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1181
- egse/shutter/__init__.py +0 -0
- egse/shutter/thorlabs/__init__.py +0 -19
- egse/shutter/thorlabs/ksc101.py +0 -205
- egse/shutter/thorlabs/ksc101.yaml +0 -105
- egse/shutter/thorlabs/ksc101_cs.py +0 -136
- egse/shutter/thorlabs/ksc101_devif.py +0 -201
- egse/shutter/thorlabs/ksc101_protocol.py +0 -71
- egse/shutter/thorlabs/ksc101_ui.py +0 -548
- egse/shutter/thorlabs/sc10.py +0 -82
- egse/shutter/thorlabs/sc10.yaml +0 -52
- egse/shutter/thorlabs/sc10_controller.py +0 -81
- egse/shutter/thorlabs/sc10_cs.py +0 -108
- egse/shutter/thorlabs/sc10_interface.py +0 -25
- egse/shutter/thorlabs/sc10_simulator.py +0 -30
- egse/simulator.py +0 -41
- egse/slack.py +0 -61
- egse/socketdevice.py +0 -218
- egse/sockets.py +0 -218
- egse/spw.py +0 -1401
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -245
- egse/stages/aerotech/ensemble.yaml +0 -205
- egse/stages/aerotech/ensemble_controller.py +0 -275
- egse/stages/aerotech/ensemble_cs.py +0 -110
- egse/stages/aerotech/ensemble_interface.py +0 -132
- egse/stages/aerotech/ensemble_parameters.py +0 -433
- egse/stages/aerotech/ensemble_simulator.py +0 -27
- egse/stages/aerotech/mgse_sim.py +0 -188
- egse/stages/arun/smd3.py +0 -110
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -470
- egse/stages/arun/smd3_cs.py +0 -112
- egse/stages/arun/smd3_interface.py +0 -53
- egse/stages/arun/smd3_simulator.py +0 -27
- egse/stages/arun/smd3_stop.py +0 -16
- egse/stages/huber/__init__.py +0 -49
- egse/stages/huber/smc9300.py +0 -920
- egse/stages/huber/smc9300.yaml +0 -63
- egse/stages/huber/smc9300_cs.py +0 -178
- egse/stages/huber/smc9300_devif.py +0 -345
- egse/stages/huber/smc9300_protocol.py +0 -113
- egse/stages/huber/smc9300_sim.py +0 -547
- egse/stages/huber/smc9300_ui.py +0 -973
- egse/state.py +0 -173
- egse/statemachine.py +0 -274
- egse/storage/__init__.py +0 -1067
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -79
- egse/storage/storage_cs.py +0 -231
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -417
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1611
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -879
- egse/tcs/tcs.yaml +0 -14
- egse/tcs/tcs_cs.py +0 -202
- egse/tcs/tcs_devif.py +0 -292
- egse/tcs/tcs_protocol.py +0 -180
- egse/tcs/tcs_sim.py +0 -177
- egse/tcs/tcs_ui.py +0 -543
- egse/tdms.py +0 -171
- egse/tempcontrol/__init__.py +0 -23
- egse/tempcontrol/agilent/agilent34970.py +0 -109
- egse/tempcontrol/agilent/agilent34970.yaml +0 -44
- egse/tempcontrol/agilent/agilent34970_cs.py +0 -114
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -96
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -115
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -98
- egse/tempcontrol/beaglebone/beaglebone.py +0 -341
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -134
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -674
- egse/tempcontrol/digalox/digalox.py +0 -115
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -108
- egse/tempcontrol/digalox/digalox_protocol.py +0 -56
- egse/tempcontrol/keithley/__init__.py +0 -33
- egse/tempcontrol/keithley/daq6510.py +0 -662
- egse/tempcontrol/keithley/daq6510.yaml +0 -105
- egse/tempcontrol/keithley/daq6510_cs.py +0 -163
- egse/tempcontrol/keithley/daq6510_devif.py +0 -343
- egse/tempcontrol/keithley/daq6510_protocol.py +0 -79
- egse/tempcontrol/keithley/daq6510_sim.py +0 -186
- egse/tempcontrol/lakeshore/__init__.py +0 -33
- egse/tempcontrol/lakeshore/lsci.py +0 -361
- egse/tempcontrol/lakeshore/lsci.yaml +0 -162
- egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
- egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
- egse/tempcontrol/lakeshore/lsci_protocol.py +0 -76
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -387
- egse/tempcontrol/ni/__init__.py +0 -0
- egse/tempcontrol/spid/spid.py +0 -109
- egse/tempcontrol/spid/spid.yaml +0 -81
- egse/tempcontrol/spid/spid_controller.py +0 -279
- egse/tempcontrol/spid/spid_cs.py +0 -136
- egse/tempcontrol/spid/spid_protocol.py +0 -107
- egse/tempcontrol/spid/spid_ui.py +0 -723
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -867
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -116
- egse/tempcontrol/srs/ptc10_protocol.py +0 -39
- egse/tempcontrol/srs/ptc10_ui.py +0 -906
- egse/ups/apc/apc.py +0 -236
- egse/ups/apc/apc.yaml +0 -45
- egse/ups/apc/apc_cs.py +0 -101
- egse/ups/apc/apc_protocol.py +0 -125
- egse/user.yaml +0 -7
- egse/vacuum/beaglebone/beaglebone.py +0 -149
- egse/vacuum/beaglebone/beaglebone.yaml +0 -44
- egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
- egse/vacuum/beaglebone/beaglebone_devif.py +0 -159
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -192
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -91
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -124
- egse/vacuum/instrutech/igm402_cs.py +0 -108
- egse/vacuum/instrutech/igm402_interface.py +0 -49
- egse/vacuum/instrutech/igm402_simulator.py +0 -36
- egse/vacuum/keller/kellerBus.py +0 -256
- egse/vacuum/keller/leo3.py +0 -100
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -81
- egse/vacuum/keller/leo3_cs.py +0 -101
- egse/vacuum/keller/leo3_interface.py +0 -33
- egse/vacuum/mks/evision.py +0 -86
- egse/vacuum/mks/evision.yaml +0 -75
- egse/vacuum/mks/evision_cs.py +0 -101
- egse/vacuum/mks/evision_devif.py +0 -313
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -701
- egse/vacuum/pfeiffer/acp40.py +0 -87
- egse/vacuum/pfeiffer/acp40.yaml +0 -60
- egse/vacuum/pfeiffer/acp40_controller.py +0 -117
- egse/vacuum/pfeiffer/acp40_cs.py +0 -109
- egse/vacuum/pfeiffer/acp40_interface.py +0 -40
- egse/vacuum/pfeiffer/acp40_simulator.py +0 -37
- egse/vacuum/pfeiffer/tc400.py +0 -87
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -136
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -35
- egse/vacuum/pfeiffer/tpg261.py +0 -80
- egse/vacuum/pfeiffer/tpg261.yaml +0 -66
- egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
- egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
- egse/vacuum/pfeiffer/tpg261_interface.py +0 -59
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -23
- egse/version.py +0 -174
- egse/visitedpositions.py +0 -398
- egse/windowing.py +0 -213
- egse/zmq/__init__.py +0 -28
- egse/zmq/spw.py +0 -160
- egse/zmq_ser.py +0 -41
- scripts/alerts/cold.yaml +0 -278
- scripts/alerts/example_alerts.yaml +0 -54
- scripts/alerts/transition.yaml +0 -14
- scripts/alerts/warm.yaml +0 -49
- scripts/analyse_n_fee_hk_data.py +0 -52
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/check_tcs_calib_coef.py +0 -90
- scripts/correct_ccd_cold_temperature_cal.py +0 -157
- scripts/create_hdf5_report.py +0 -293
- scripts/csl_model.py +0 -420
- scripts/csl_restore_setup.py +0 -229
- scripts/export-grafana-dashboards.py +0 -49
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -54
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -10
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -61
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -59
- scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
- scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
- scripts/fix_csv.py +0 -80
- scripts/ias/correct_ccd_temp_cal_elfique.py +0 -43
- scripts/ias/correct_ccd_temp_cal_floreffe.py +0 -43
- scripts/ias/correct_trp_swap_achel.py +0 -199
- scripts/inta/correct_ccd_temp_cal_duvel.py +0 -43
- scripts/inta/correct_ccd_temp_cal_gueuze.py +0 -43
- scripts/n_fee_supply_voltage_calculation.py +0 -92
- scripts/playground.py +0 -30
- scripts/print_hdf5_hk_data.py +0 -68
- scripts/print_register_map.py +0 -43
- scripts/remove_lines_between_matches.py +0 -188
- scripts/sron/commanding/control_heaters.py +0 -44
- scripts/sron/commanding/pumpdown.py +0 -46
- scripts/sron/commanding/set_pid_setpoint.py +0 -19
- scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
- scripts/sron/commanding/shutdown_pumps.py +0 -33
- scripts/sron/correct_mgse_coordinates_brigand_chimay.py +0 -272
- scripts/sron/correct_trp_swap_brigand.py +0 -204
- scripts/sron/gimbal_conversions.py +0 -75
- scripts/sron/tm_gen/tm_gen_agilent.py +0 -37
- scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
- scripts/sron/tm_gen/tm_gen_spid.py +0 -13
- scripts/update_operational_cgse.py +0 -268
- scripts/update_operational_cgse_old.py +0 -273
egse/confman/confman.yaml
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
UserInterface:
|
|
2
|
-
egse.confman.confman_ui
|
|
3
|
-
|
|
4
|
-
Commands:
|
|
5
|
-
|
|
6
|
-
# Each of these groups is parsed and used on both the server and the client side.
|
|
7
|
-
#
|
|
8
|
-
# The group name (aka command name, e.g. start_observation) will be monkey patched in the Proxy
|
|
9
|
-
# class for the device or service.
|
|
10
|
-
#
|
|
11
|
-
# The other field are:
|
|
12
|
-
# description: Used by the doc_string method to generate a help string
|
|
13
|
-
# cmd: Command string that will eventually be send to the hardware controller for
|
|
14
|
-
# the device. This cmd string is also used at the client side to parse and
|
|
15
|
-
# validate the arguments.
|
|
16
|
-
# device_method: The name of the method to be called on the device class.
|
|
17
|
-
# These should all be defined by the interface class for the device, i.e.
|
|
18
|
-
# PunaInterface in this case.
|
|
19
|
-
# When the device_method is the same as the group name, it can be omitted.
|
|
20
|
-
# response: The name of the method to be called from the device protocol.
|
|
21
|
-
# This method should exist in the subclass of the CommandProtocol base class,
|
|
22
|
-
# i.e. in this case it will be the PunaProtocol class.
|
|
23
|
-
# The default (when no response is given) is 'handle_device_method'.
|
|
24
|
-
|
|
25
|
-
# Commands to start/end/maintain an Observation/Test
|
|
26
|
-
|
|
27
|
-
start_observation:
|
|
28
|
-
description: Start a new observation aka test.
|
|
29
|
-
cmd: '{function_info}'
|
|
30
|
-
|
|
31
|
-
end_observation:
|
|
32
|
-
description: End the current observation.
|
|
33
|
-
|
|
34
|
-
get_obsid:
|
|
35
|
-
description: Return the observation identifier (OBSID) for the current test.
|
|
36
|
-
|
|
37
|
-
When no test is running, i.e. we have not started an observation,
|
|
38
|
-
then a Message is returned.
|
|
39
|
-
|
|
40
|
-
# Commands for handling Setups
|
|
41
|
-
|
|
42
|
-
load_setup:
|
|
43
|
-
description: Loads the Setup for the given `id` in the configuration manager.
|
|
44
|
-
cmd: "{id}"
|
|
45
|
-
|
|
46
|
-
get_setup:
|
|
47
|
-
description: Returns the current Setup that is loaded in the configuration manager.
|
|
48
|
-
cmd: "*"
|
|
49
|
-
|
|
50
|
-
reload_setups:
|
|
51
|
-
description: Clears the cache and reloads the available Setups
|
|
52
|
-
|
|
53
|
-
list_setups:
|
|
54
|
-
description: Returns a list of Setups that is available for the tests. The returned
|
|
55
|
-
list is a list of named tuples with the fields `id` and `site`.
|
|
56
|
-
cmd: "**"
|
|
57
|
-
|
|
58
|
-
submit_setup:
|
|
59
|
-
description: Submit a (new) Setup to the configuration manager. The Setup will be
|
|
60
|
-
assigned a unique identifier and committed to the git repository.
|
|
61
|
-
cmd: "{setup} {description} {replace}"
|
|
62
|
-
|
|
63
|
-
get_listener_names:
|
|
64
|
-
description: Returns a list of names of listeners that need to be notified when a new Setup is loaded.
|
|
65
|
-
|
|
66
|
-
# Commands that are mainly used by the ProcessManager
|
|
67
|
-
|
|
68
|
-
get_setup_for_obsid:
|
|
69
|
-
description: Returns the Setup that was used for the given `obsid`.
|
|
70
|
-
cmd: "{obsid}"
|
egse/confman/confman_cs.py
DELETED
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
The Configuration Manager is a server that controls and distributes configuration settings.
|
|
3
|
-
|
|
4
|
-
The following functionality is provided:
|
|
5
|
-
|
|
6
|
-
* creation and distribution of observation identifiers
|
|
7
|
-
* start and end of observations or tests
|
|
8
|
-
* maintain proper Setups and distribute the latest Setup on demand
|
|
9
|
-
|
|
10
|
-
"""
|
|
11
|
-
import logging
|
|
12
|
-
import multiprocessing
|
|
13
|
-
import sys
|
|
14
|
-
from pathlib import Path
|
|
15
|
-
|
|
16
|
-
import click
|
|
17
|
-
import zmq
|
|
18
|
-
from prometheus_client import start_http_server
|
|
19
|
-
|
|
20
|
-
from egse.confman import ConfigurationManagerProtocol
|
|
21
|
-
from egse.confman import ConfigurationManagerProxy
|
|
22
|
-
from egse.confman import is_configuration_manager_active
|
|
23
|
-
from egse.control import ControlServer
|
|
24
|
-
from egse.control import Response
|
|
25
|
-
from egse.control import Success
|
|
26
|
-
from egse.settings import Settings
|
|
27
|
-
from egse.system import replace_environment_variable
|
|
28
|
-
|
|
29
|
-
# Use explicit name here otherwise the logger will probably be called __main__
|
|
30
|
-
|
|
31
|
-
logger = logging.getLogger(__name__)
|
|
32
|
-
|
|
33
|
-
CTRL_SETTINGS = Settings.load("Configuration Manager Control Server")
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class ConfigurationManagerControlServer(ControlServer):
|
|
37
|
-
def __init__(self):
|
|
38
|
-
super().__init__()
|
|
39
|
-
|
|
40
|
-
self.device_protocol = ConfigurationManagerProtocol(self)
|
|
41
|
-
|
|
42
|
-
self.logger = logger
|
|
43
|
-
self.logger.debug(f"Binding ZeroMQ socket to {self.device_protocol.get_bind_address()}")
|
|
44
|
-
|
|
45
|
-
self.device_protocol.bind(self.dev_ctrl_cmd_sock)
|
|
46
|
-
|
|
47
|
-
self.poller.register(self.dev_ctrl_cmd_sock, zmq.POLLIN)
|
|
48
|
-
|
|
49
|
-
def get_communication_protocol(self):
|
|
50
|
-
return CTRL_SETTINGS.PROTOCOL
|
|
51
|
-
|
|
52
|
-
def get_commanding_port(self):
|
|
53
|
-
return CTRL_SETTINGS.COMMANDING_PORT
|
|
54
|
-
|
|
55
|
-
def get_service_port(self):
|
|
56
|
-
return CTRL_SETTINGS.SERVICE_PORT
|
|
57
|
-
|
|
58
|
-
def get_monitoring_port(self):
|
|
59
|
-
return CTRL_SETTINGS.MONITORING_PORT
|
|
60
|
-
|
|
61
|
-
def get_storage_mnemonic(self):
|
|
62
|
-
try:
|
|
63
|
-
return CTRL_SETTINGS.STORAGE_MNEMONIC
|
|
64
|
-
except AttributeError:
|
|
65
|
-
return "CM"
|
|
66
|
-
|
|
67
|
-
def before_serve(self):
|
|
68
|
-
start_http_server(CTRL_SETTINGS.METRICS_PORT)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
@click.group()
|
|
72
|
-
def cli():
|
|
73
|
-
pass
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
@cli.command()
|
|
77
|
-
def start():
|
|
78
|
-
"""
|
|
79
|
-
Starts the Configuration Manager (cm_cs). The cm_cs is a server which handles the
|
|
80
|
-
configuration (aka Setup) of your test system.
|
|
81
|
-
|
|
82
|
-
The cm_cs is normally started automatically on egse-server boot.
|
|
83
|
-
"""
|
|
84
|
-
|
|
85
|
-
multiprocessing.current_process().name = "confman_cs"
|
|
86
|
-
|
|
87
|
-
try:
|
|
88
|
-
check_prerequisites()
|
|
89
|
-
except RuntimeError as exc:
|
|
90
|
-
logger.info(exc)
|
|
91
|
-
return 0
|
|
92
|
-
|
|
93
|
-
try:
|
|
94
|
-
control_server = ConfigurationManagerControlServer()
|
|
95
|
-
control_server.serve()
|
|
96
|
-
except KeyboardInterrupt:
|
|
97
|
-
print("Shutdown requested...exiting")
|
|
98
|
-
except SystemExit as exit_code:
|
|
99
|
-
print("System Exit with code {}.".format(exit_code))
|
|
100
|
-
sys.exit(exit_code)
|
|
101
|
-
except Exception:
|
|
102
|
-
import traceback
|
|
103
|
-
|
|
104
|
-
traceback.print_exc(file=sys.stdout)
|
|
105
|
-
|
|
106
|
-
return 0
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
@cli.command()
|
|
110
|
-
def stop():
|
|
111
|
-
"""Send a 'quit_server' command to the Configuration Manager."""
|
|
112
|
-
with ConfigurationManagerProxy() as cm:
|
|
113
|
-
sp = cm.get_service_proxy()
|
|
114
|
-
sp.quit_server()
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
@cli.command()
|
|
118
|
-
def status():
|
|
119
|
-
"""Print the status of the control server."""
|
|
120
|
-
|
|
121
|
-
import rich
|
|
122
|
-
|
|
123
|
-
rich.print('Configuration manager:')
|
|
124
|
-
if is_configuration_manager_active():
|
|
125
|
-
rich.print(' Status: [green]active')
|
|
126
|
-
with ConfigurationManagerProxy() as cm:
|
|
127
|
-
obsid: Success = cm.get_obsid()
|
|
128
|
-
obsid = obsid.return_code
|
|
129
|
-
setup = cm.get_setup()
|
|
130
|
-
try:
|
|
131
|
-
rich.print(f" Site ID: {setup.site_id}")
|
|
132
|
-
except AttributeError:
|
|
133
|
-
rich.print(' Site ID: [red]UNKNOWN')
|
|
134
|
-
|
|
135
|
-
if obsid:
|
|
136
|
-
rich.print(f" Running observation: {obsid}")
|
|
137
|
-
else:
|
|
138
|
-
rich.print(" No observation running")
|
|
139
|
-
|
|
140
|
-
try:
|
|
141
|
-
if setup.has_private_attribute("_setup_id"):
|
|
142
|
-
setup_id = setup.get_private_attribute("_setup_id")
|
|
143
|
-
rich.print(f" Setup loaded: {setup_id}")
|
|
144
|
-
else:
|
|
145
|
-
rich.print(' [red]No Setup loaded')
|
|
146
|
-
except Exception as exc:
|
|
147
|
-
rich.print(setup)
|
|
148
|
-
rich.print(exc)
|
|
149
|
-
|
|
150
|
-
rich.print(f" Hostname: {cm.get_ip_address()}")
|
|
151
|
-
rich.print(f" Monitoring port: {cm.get_monitoring_port()}")
|
|
152
|
-
rich.print(f" Commanding port: {cm.get_commanding_port()}")
|
|
153
|
-
rich.print(f" Service port: {cm.get_service_port()}")
|
|
154
|
-
rich.print(f" Listeners: {', '.join(cm.get_listener_names())}")
|
|
155
|
-
else:
|
|
156
|
-
rich.print(' Status: [red]not active')
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
@cli.command()
|
|
160
|
-
def list_setups(**attr):
|
|
161
|
-
"""List available Setups."""
|
|
162
|
-
|
|
163
|
-
with ConfigurationManagerProxy() as cm:
|
|
164
|
-
setups = cm.list_setups(**attr)
|
|
165
|
-
if setups:
|
|
166
|
-
# We want to have the most recent (highest id number) last, but keep the site together
|
|
167
|
-
setups = sorted(setups, key=lambda x: (x[1], x[0]))
|
|
168
|
-
print("\n".join(f"{setup}" for setup in setups))
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
@cli.command()
|
|
172
|
-
@click.argument('setup_id', type=int)
|
|
173
|
-
def load_setup(setup_id):
|
|
174
|
-
"""Load the given Setup on the configuration manager."""
|
|
175
|
-
|
|
176
|
-
with ConfigurationManagerProxy() as cm:
|
|
177
|
-
setup = cm.load_setup(setup_id)
|
|
178
|
-
if isinstance(setup, Response):
|
|
179
|
-
print(setup)
|
|
180
|
-
return
|
|
181
|
-
if setup.has_private_attribute("_setup_id"):
|
|
182
|
-
setup_id = setup.get_private_attribute("_setup_id")
|
|
183
|
-
print(f"{setup_id} loaded on configuration manager.")
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
@cli.command()
|
|
187
|
-
def reload_setups():
|
|
188
|
-
""" Clears the cache and re-loads the available setups.
|
|
189
|
-
|
|
190
|
-
Note that this does not affect the currently loaded setup.
|
|
191
|
-
"""
|
|
192
|
-
|
|
193
|
-
with ConfigurationManagerProxy() as pm:
|
|
194
|
-
pm.reload_setups()
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
def check_prerequisites():
|
|
198
|
-
"""Checks if all prerequisites for running the Configuration Manager are met.
|
|
199
|
-
|
|
200
|
-
Raises:
|
|
201
|
-
RuntimeError when one or more of the prerequisites is not met.
|
|
202
|
-
"""
|
|
203
|
-
|
|
204
|
-
fails = 0
|
|
205
|
-
|
|
206
|
-
# We need a proper location for storing the configuration data.
|
|
207
|
-
|
|
208
|
-
location = CTRL_SETTINGS.FILE_STORAGE_LOCATION
|
|
209
|
-
location = replace_environment_variable(location)
|
|
210
|
-
|
|
211
|
-
if not location:
|
|
212
|
-
raise RuntimeError(
|
|
213
|
-
"The environment variable referenced in the Settings.yaml file for the "
|
|
214
|
-
"FILE_STORAGE_LOCATION of the Configuration Manager does not exist, please set "
|
|
215
|
-
"the environment variable."
|
|
216
|
-
)
|
|
217
|
-
|
|
218
|
-
location = Path(location)
|
|
219
|
-
|
|
220
|
-
if not location.exists():
|
|
221
|
-
logger.error(
|
|
222
|
-
f"The directory {location} does not exist, provide a writable location for "
|
|
223
|
-
f"storing the configuration data."
|
|
224
|
-
)
|
|
225
|
-
fails += 1
|
|
226
|
-
|
|
227
|
-
# logger.debug(f"Storage location for configuration data = {location}")
|
|
228
|
-
|
|
229
|
-
# now raise the final verdict
|
|
230
|
-
|
|
231
|
-
if fails:
|
|
232
|
-
raise RuntimeError(
|
|
233
|
-
"Some of the prerequisites for the Configuration Manager haven't met. "
|
|
234
|
-
"Please check the logs."
|
|
235
|
-
)
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
if __name__ == "__main__":
|
|
239
|
-
|
|
240
|
-
sys.exit(cli())
|
egse/confman/confman_ui.py
DELETED
|
@@ -1,381 +0,0 @@
|
|
|
1
|
-
import pickle
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
|
|
4
|
-
import sys
|
|
5
|
-
|
|
6
|
-
import zmq
|
|
7
|
-
from PyQt5.QtCore import Qt, QThread, pyqtSignal, pyqtSlot, QObject, QLockFile
|
|
8
|
-
from PyQt5.QtGui import QPixmap, QIcon, QCloseEvent
|
|
9
|
-
from PyQt5.QtWidgets import (QApplication, QFrame, QHBoxLayout, QLabel, QMainWindow, QTextBrowser, QVBoxLayout, QAction,
|
|
10
|
-
QMessageBox)
|
|
11
|
-
from rich.console import Console
|
|
12
|
-
|
|
13
|
-
from egse.config import find_file
|
|
14
|
-
from egse.confman import (ConfigurationManagerProxy, is_configuration_manager_active)
|
|
15
|
-
from egse.confman.setup_ui import SetupUIView
|
|
16
|
-
from egse.resource import get_resource
|
|
17
|
-
from egse.settings import Settings
|
|
18
|
-
from egse.zmq_ser import set_address_port
|
|
19
|
-
|
|
20
|
-
CTRL_SETTINGS = Settings.load("Configuration Manager Control Server")
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class ConfigurationManagerUIView(QMainWindow):
|
|
24
|
-
|
|
25
|
-
def __init__(self):
|
|
26
|
-
|
|
27
|
-
""" Initialisation of the Configuration Manager GUI.
|
|
28
|
-
|
|
29
|
-
The components are placed in the window and a thread is created to
|
|
30
|
-
listen to the monitoring port of the configuration manager. When the
|
|
31
|
-
obsid and/or setup change, this information is updated in the GUI.
|
|
32
|
-
"""
|
|
33
|
-
|
|
34
|
-
super().__init__()
|
|
35
|
-
|
|
36
|
-
self.setGeometry(300, 300, 1000, 500)
|
|
37
|
-
self.setWindowTitle("Configuration Manager")
|
|
38
|
-
|
|
39
|
-
self.setup_ui = SetupUIView()
|
|
40
|
-
|
|
41
|
-
# Build GUI
|
|
42
|
-
|
|
43
|
-
self.toolbar = self.addToolBar("MainToolbar")
|
|
44
|
-
|
|
45
|
-
self.init_gui()
|
|
46
|
-
|
|
47
|
-
# Listen to the monitoring port of the CM in the background (i.e. in a
|
|
48
|
-
# separate thread) and update the content of the GUI if needed
|
|
49
|
-
|
|
50
|
-
self.start_monitoring()
|
|
51
|
-
|
|
52
|
-
def start_monitoring(self):
|
|
53
|
-
""" Start listening to the monitoring port.
|
|
54
|
-
|
|
55
|
-
Create and start a thread that listens on the monitoring port in the
|
|
56
|
-
background. If the obsid and/or setup have changed, the information
|
|
57
|
-
in the GUI is updated.
|
|
58
|
-
"""
|
|
59
|
-
|
|
60
|
-
self.monitoring_thread = QThread(self)
|
|
61
|
-
self.monitoring_worker = MonitoringWorker()
|
|
62
|
-
self.monitoring_worker.moveToThread(self.monitoring_thread)
|
|
63
|
-
|
|
64
|
-
self.monitoring_worker.monitoring_signal.connect(self.update_values)
|
|
65
|
-
self.monitoring_thread.started.connect(self.monitoring_worker.start_process)
|
|
66
|
-
|
|
67
|
-
def closeEvent(self, close_event: QCloseEvent) -> None:
|
|
68
|
-
""" Make sure that the thread is stopped when the GUI is closed.
|
|
69
|
-
|
|
70
|
-
Args:
|
|
71
|
-
- close_event: Close event received when the GUI is closed.
|
|
72
|
-
"""
|
|
73
|
-
|
|
74
|
-
self.monitoring_worker.active = False
|
|
75
|
-
self.monitoring_thread.quit()
|
|
76
|
-
self.monitoring_thread.wait()
|
|
77
|
-
|
|
78
|
-
def update_values(self, monitoring_info):
|
|
79
|
-
""" Update the obsid and setup in the GUI.
|
|
80
|
-
|
|
81
|
-
If the obsid and/or the setup have changed, this information needs to
|
|
82
|
-
be updated in the GUI.
|
|
83
|
-
|
|
84
|
-
Args:
|
|
85
|
-
- monitoring_info: Information received from the monitoring port
|
|
86
|
-
of the Configuration Manager. This contains
|
|
87
|
-
the obsid and setup.
|
|
88
|
-
"""
|
|
89
|
-
|
|
90
|
-
# Update the obsid in the GUI
|
|
91
|
-
|
|
92
|
-
self.update_obsid(monitoring_info["obsid"])
|
|
93
|
-
|
|
94
|
-
# Update the setup in the GUI
|
|
95
|
-
|
|
96
|
-
self.update_setup(monitoring_info["setup"])
|
|
97
|
-
|
|
98
|
-
def update_obsid(self, obsid):
|
|
99
|
-
""" Update the obsid in the GUI.
|
|
100
|
-
|
|
101
|
-
If the give obsid is None, no observation is running (which will be
|
|
102
|
-
shown in the GUI). The frame around the GUI will turn green, to
|
|
103
|
-
indicate that it is safe to shut down the EGSE Control Servers.
|
|
104
|
-
Otherwise, an observation (with the given identifier is running):
|
|
105
|
-
the obsid will be shown in the GUI and the frame around the GUI will
|
|
106
|
-
turn red, indicating that it is not safe to shut down the EGSE Control
|
|
107
|
-
Servers.
|
|
108
|
-
|
|
109
|
-
Args:
|
|
110
|
-
- obsid: New obsid to show in the GUI. None if no observation is
|
|
111
|
-
running.
|
|
112
|
-
"""
|
|
113
|
-
|
|
114
|
-
# No observation is running
|
|
115
|
-
|
|
116
|
-
if obsid is None:
|
|
117
|
-
|
|
118
|
-
self.setStyleSheet('QMainWindow{border: 3px solid green;}')
|
|
119
|
-
|
|
120
|
-
self.obsid.setText("No observation is running")
|
|
121
|
-
|
|
122
|
-
# Observation is running
|
|
123
|
-
|
|
124
|
-
else:
|
|
125
|
-
|
|
126
|
-
self.setStyleSheet('QMainWindow{border: 3px solid red;}')
|
|
127
|
-
|
|
128
|
-
self.obsid.setText(str(obsid))
|
|
129
|
-
|
|
130
|
-
def update_setup(self, setup):
|
|
131
|
-
""" Update the setup in the GUI.
|
|
132
|
-
|
|
133
|
-
Args:
|
|
134
|
-
- setup: New setup to show in the GUI.
|
|
135
|
-
"""
|
|
136
|
-
|
|
137
|
-
self.setup.setText(setup.pretty_str())
|
|
138
|
-
|
|
139
|
-
console = Console(width=120, force_terminal=False, force_jupyter=False)
|
|
140
|
-
with console.capture() as capture:
|
|
141
|
-
console.print(setup)
|
|
142
|
-
text = capture.get()
|
|
143
|
-
|
|
144
|
-
self.setup.setText(text)
|
|
145
|
-
|
|
146
|
-
def init_gui(self):
|
|
147
|
-
""" Put the components in the GUI window.
|
|
148
|
-
|
|
149
|
-
The GUI comprises the following components:
|
|
150
|
-
- text field with the obsid;
|
|
151
|
-
- scrollable area with the current setup (loaded by the
|
|
152
|
-
Configuration Manager).
|
|
153
|
-
"""
|
|
154
|
-
|
|
155
|
-
app_frame = QFrame()
|
|
156
|
-
app_frame.setObjectName("AppFrame")
|
|
157
|
-
|
|
158
|
-
self.add_toolbar()
|
|
159
|
-
|
|
160
|
-
box = QVBoxLayout()
|
|
161
|
-
|
|
162
|
-
# Obsid
|
|
163
|
-
|
|
164
|
-
hbox = QHBoxLayout()
|
|
165
|
-
|
|
166
|
-
hbox.addWidget(QLabel("Obsid"))
|
|
167
|
-
|
|
168
|
-
self.obsid = QLabel("No observation is running")
|
|
169
|
-
hbox.addWidget(self.obsid)
|
|
170
|
-
|
|
171
|
-
box.addLayout(hbox)
|
|
172
|
-
|
|
173
|
-
# Setup
|
|
174
|
-
|
|
175
|
-
self.setup = QTextBrowser(self)
|
|
176
|
-
self.setup.setText("No setup loaded")
|
|
177
|
-
|
|
178
|
-
self.setup.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
|
|
179
|
-
self.setup.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
|
|
180
|
-
|
|
181
|
-
box.addWidget(QLabel("Setup"))
|
|
182
|
-
box.addWidget(self.setup)
|
|
183
|
-
|
|
184
|
-
app_frame.setLayout(box)
|
|
185
|
-
|
|
186
|
-
self.setCentralWidget(app_frame)
|
|
187
|
-
|
|
188
|
-
def add_toolbar(self):
|
|
189
|
-
|
|
190
|
-
search_pix = QPixmap(str(find_file("search.png", in_dir="images")))
|
|
191
|
-
search_icon = QIcon()
|
|
192
|
-
search_icon.addPixmap(search_pix, QIcon.Normal, QIcon.On)
|
|
193
|
-
|
|
194
|
-
inspect_setup_action = QAction(search_icon, "Inspect available setups", self)
|
|
195
|
-
inspect_setup_action.setToolTip(
|
|
196
|
-
"Open separate window to inspect all available setups.")
|
|
197
|
-
inspect_setup_action.setCheckable(False)
|
|
198
|
-
inspect_setup_action.triggered.connect(self.open_setup_ui)
|
|
199
|
-
|
|
200
|
-
self.toolbar.addAction(inspect_setup_action)
|
|
201
|
-
|
|
202
|
-
return self.toolbar
|
|
203
|
-
|
|
204
|
-
def open_setup_ui(self):
|
|
205
|
-
""" Open separate window to inspect the available setups.
|
|
206
|
-
"""
|
|
207
|
-
|
|
208
|
-
self.setup_ui.show()
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
class ConfigurationManagerUIModel:
|
|
212
|
-
|
|
213
|
-
def __init__(self):
|
|
214
|
-
|
|
215
|
-
""" Initialisation of the Configuration Manager UI model.
|
|
216
|
-
"""
|
|
217
|
-
|
|
218
|
-
try:
|
|
219
|
-
|
|
220
|
-
self.cm = ConfigurationManagerProxy()
|
|
221
|
-
|
|
222
|
-
except ConnectionError:
|
|
223
|
-
|
|
224
|
-
self.cm = None
|
|
225
|
-
|
|
226
|
-
def is_connected(self):
|
|
227
|
-
""" Checks whether the Configuration Manager is active.
|
|
228
|
-
|
|
229
|
-
Returns:
|
|
230
|
-
- True if the Configuration Manager is active; False otherwise.
|
|
231
|
-
"""
|
|
232
|
-
|
|
233
|
-
return is_configuration_manager_active()
|
|
234
|
-
|
|
235
|
-
def update(self, changed_object):
|
|
236
|
-
pass
|
|
237
|
-
|
|
238
|
-
def do(self):
|
|
239
|
-
pass
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
class MonitoringWorker(QObject):
|
|
243
|
-
|
|
244
|
-
# The thread will send a signal with the monitoring information:
|
|
245
|
-
# - The obsid;
|
|
246
|
-
# - The setup that has been loaded by the configuration manager.
|
|
247
|
-
|
|
248
|
-
monitoring_signal = pyqtSignal(dict)
|
|
249
|
-
|
|
250
|
-
def __init__(self):
|
|
251
|
-
|
|
252
|
-
""" Initialisation of a monitoring thread.
|
|
253
|
-
|
|
254
|
-
This monitoring thread will listen on the monitoring port of the
|
|
255
|
-
Control Server. At this point the socket (that will connect to the
|
|
256
|
-
monitoring port) is not created yet.
|
|
257
|
-
"""
|
|
258
|
-
|
|
259
|
-
super(MonitoringWorker, self).__init__()
|
|
260
|
-
|
|
261
|
-
self.obsid = None # Previous obsid
|
|
262
|
-
self.setup = None # Previous setup
|
|
263
|
-
|
|
264
|
-
self.active = False
|
|
265
|
-
|
|
266
|
-
def connect_socket(self, proxy):
|
|
267
|
-
""" Create a socket and connect to the monitoring port.
|
|
268
|
-
|
|
269
|
-
Args:
|
|
270
|
-
- proxy_type: Proxy type (needed to read the connection details).
|
|
271
|
-
"""
|
|
272
|
-
|
|
273
|
-
# Start listening to the monitoring port
|
|
274
|
-
|
|
275
|
-
self.socket = zmq.Context().socket(zmq.SUB)
|
|
276
|
-
|
|
277
|
-
endpoint = proxy.get_endpoint()
|
|
278
|
-
monitoring_port = proxy.get_monitoring_port()
|
|
279
|
-
address = set_address_port(endpoint, monitoring_port)
|
|
280
|
-
|
|
281
|
-
self.socket.connect(address)
|
|
282
|
-
self.socket.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
283
|
-
|
|
284
|
-
def start_process(self):
|
|
285
|
-
""" Start listening on the monitoring port.
|
|
286
|
-
"""
|
|
287
|
-
|
|
288
|
-
self.run()
|
|
289
|
-
|
|
290
|
-
@pyqtSlot()
|
|
291
|
-
def run(self):
|
|
292
|
-
""" Keep on listening on the monitoring port.
|
|
293
|
-
|
|
294
|
-
If monitoring information is received before the timeout, it is
|
|
295
|
-
checked whether the obsid and/or current setup have changed. If so, a
|
|
296
|
-
signal with the monitoring information is emitted.
|
|
297
|
-
"""
|
|
298
|
-
|
|
299
|
-
self.active = True
|
|
300
|
-
|
|
301
|
-
while self.active:
|
|
302
|
-
|
|
303
|
-
socket_list, _, _ = zmq.select([self.socket], [], [], timeout=1)
|
|
304
|
-
|
|
305
|
-
# Monitoring information was received (before timeout)
|
|
306
|
-
|
|
307
|
-
if self.socket in socket_list:
|
|
308
|
-
|
|
309
|
-
pickle_string = self.socket.recv()
|
|
310
|
-
monitoring_info = pickle.loads(pickle_string)
|
|
311
|
-
|
|
312
|
-
new_obsid = monitoring_info["obsid"] # New obsid
|
|
313
|
-
new_setup = monitoring_info["setup"] # New setup
|
|
314
|
-
|
|
315
|
-
# The obsid and/or setup have changed
|
|
316
|
-
|
|
317
|
-
if (new_obsid != self.obsid) or (new_setup != self.setup):
|
|
318
|
-
|
|
319
|
-
self.obsid = new_obsid
|
|
320
|
-
self.setup = new_setup
|
|
321
|
-
|
|
322
|
-
# Emit the monitoring info
|
|
323
|
-
|
|
324
|
-
self.monitoring_signal.emit(monitoring_info)
|
|
325
|
-
|
|
326
|
-
self.socket.close(linger=0)
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
class ConfigurationManagerUIController:
|
|
330
|
-
|
|
331
|
-
def __init__(self, model: ConfigurationManagerUIModel,
|
|
332
|
-
view: ConfigurationManagerUIView):
|
|
333
|
-
|
|
334
|
-
""" Initialisation of the Controller for the Process Manager GUI.
|
|
335
|
-
|
|
336
|
-
Args:
|
|
337
|
-
- model: Configuration Manager UI model.
|
|
338
|
-
- view: Configuration Manager UI view.
|
|
339
|
-
"""
|
|
340
|
-
|
|
341
|
-
self.model = model
|
|
342
|
-
self.view = view
|
|
343
|
-
|
|
344
|
-
self.view.monitoring_worker.connect_socket(self.model.cm)
|
|
345
|
-
self.view.monitoring_thread.start()
|
|
346
|
-
|
|
347
|
-
def update(self, changed_object):
|
|
348
|
-
pass
|
|
349
|
-
|
|
350
|
-
def do(self):
|
|
351
|
-
pass
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
def main():
|
|
355
|
-
""" Main method to launch the Configuration Manager GUI.
|
|
356
|
-
"""
|
|
357
|
-
|
|
358
|
-
lock_file = QLockFile(str(Path("~/cm_ui.app.lock").expanduser()))
|
|
359
|
-
|
|
360
|
-
app = QApplication(sys.argv)
|
|
361
|
-
app.setWindowIcon(QIcon(str(get_resource(":/icons/settings.svg"))))
|
|
362
|
-
|
|
363
|
-
if lock_file.tryLock(100):
|
|
364
|
-
view = ConfigurationManagerUIView()
|
|
365
|
-
model = ConfigurationManagerUIModel()
|
|
366
|
-
ConfigurationManagerUIController(model, view)
|
|
367
|
-
|
|
368
|
-
view.show()
|
|
369
|
-
sys.exit(app.exec_())
|
|
370
|
-
else:
|
|
371
|
-
error_message = QMessageBox()
|
|
372
|
-
error_message.setIcon(QMessageBox.Warning)
|
|
373
|
-
error_message.setWindowTitle("Error")
|
|
374
|
-
error_message.setText("The Configuration Manager (CM) GUI application is already running!")
|
|
375
|
-
error_message.setStandardButtons(QMessageBox.Ok)
|
|
376
|
-
|
|
377
|
-
return error_message.exec()
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
if __name__ == "__main__":
|
|
381
|
-
main()
|