cgse 2024.7.0__py3-none-any.whl → 2025.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- README.md +27 -0
- bump.py +85 -0
- cgse-2025.0.2.dist-info/METADATA +38 -0
- cgse-2025.0.2.dist-info/RECORD +5 -0
- {cgse-2024.7.0.dist-info → cgse-2025.0.2.dist-info}/WHEEL +1 -2
- cgse-2024.7.0.dist-info/COPYING +0 -674
- cgse-2024.7.0.dist-info/COPYING.LESSER +0 -165
- cgse-2024.7.0.dist-info/METADATA +0 -144
- cgse-2024.7.0.dist-info/RECORD +0 -660
- cgse-2024.7.0.dist-info/entry_points.txt +0 -75
- cgse-2024.7.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5238
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -627
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -903
- egse/aeu/aeu_metrics.py +0 -131
- egse/aeu/aeu_protocol.py +0 -463
- egse/aeu/aeu_psu.yaml +0 -204
- egse/aeu/aeu_ui.py +0 -873
- egse/aeu/arbdata/FccdRead.arb +0 -2
- egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
- egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/ccdRead25.arb +0 -2
- egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead50.arb +0 -2
- egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
- egse/alert/__init__.py +0 -1049
- egse/alert/alertman.yaml +0 -37
- egse/alert/alertman_cs.py +0 -233
- egse/alert/alertman_ui.py +0 -600
- egse/alert/gsm/beaglebone.py +0 -138
- egse/alert/gsm/beaglebone.yaml +0 -51
- egse/alert/gsm/beaglebone_cs.py +0 -108
- egse/alert/gsm/beaglebone_devif.py +0 -122
- egse/alert/gsm/beaglebone_protocol.py +0 -46
- egse/bits.py +0 -318
- egse/camera.py +0 -44
- egse/collimator/__init__.py +0 -0
- egse/collimator/fcul/__init__.py +0 -0
- egse/collimator/fcul/ogse.py +0 -1077
- egse/collimator/fcul/ogse.yaml +0 -14
- egse/collimator/fcul/ogse_cs.py +0 -154
- egse/collimator/fcul/ogse_devif.py +0 -358
- egse/collimator/fcul/ogse_protocol.py +0 -132
- egse/collimator/fcul/ogse_sim.py +0 -431
- egse/collimator/fcul/ogse_ui.py +0 -1108
- egse/command.py +0 -699
- egse/config.py +0 -410
- egse/confman/__init__.py +0 -1058
- egse/confman/confman.yaml +0 -70
- egse/confman/confman_cs.py +0 -240
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -632
- egse/coordinates/__init__.py +0 -534
- egse/coordinates/avoidance.py +0 -100
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -122
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -194
- egse/coordinates/referenceFrame.py +0 -1279
- egse/coordinates/refmodel.py +0 -737
- egse/coordinates/rotationMatrix.py +0 -85
- egse/coordinates/transform3d_addon.py +0 -419
- egse/csl/__init__.py +0 -50
- egse/csl/commanding.py +0 -78
- egse/csl/icons/hexapod-connected-selected.svg +0 -30
- egse/csl/icons/hexapod-connected.svg +0 -30
- egse/csl/icons/hexapod-homing-selected.svg +0 -68
- egse/csl/icons/hexapod-homing.svg +0 -68
- egse/csl/icons/hexapod-retract-selected.svg +0 -56
- egse/csl/icons/hexapod-retract.svg +0 -51
- egse/csl/icons/hexapod-zero-selected.svg +0 -56
- egse/csl/icons/hexapod-zero.svg +0 -56
- egse/csl/icons/logo-puna.svg +0 -92
- egse/csl/icons/stop.svg +0 -1
- egse/csl/initialisation.py +0 -102
- egse/csl/mech_pos_settings.yaml +0 -18
- egse/das.py +0 -1240
- egse/das.yaml +0 -7
- egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
- egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
- egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
- egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
- egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
- egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
- egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
- egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
- egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
- egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
- egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
- egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
- egse/decorators.py +0 -514
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2698
- egse/dpu/ccd_ui.py +0 -514
- egse/dpu/dpu.py +0 -783
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -671
- egse/dpu/fitsgen.py +0 -2096
- egse/dpu/fitsgen_ui.py +0 -399
- egse/dpu/hdf5_model.py +0 -332
- egse/dpu/hdf5_ui.py +0 -277
- egse/dpu/hdf5_viewer.py +0 -506
- egse/dpu/hk_ui.py +0 -468
- egse/dpu_commands.py +0 -81
- egse/dsi/__init__.py +0 -33
- egse/dsi/_libesl.py +0 -232
- egse/dsi/constants.py +0 -296
- egse/dsi/esl.py +0 -630
- egse/dsi/rmap.py +0 -444
- egse/dsi/rmapci.py +0 -39
- egse/dsi/spw.py +0 -335
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -318
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -26
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -37
- egse/fdir/fdir_manager_controller.py +0 -136
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -15
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -30
- egse/fdir/fdir_remote_controller.py +0 -30
- egse/fdir/fdir_remote_cs.py +0 -94
- egse/fdir/fdir_remote_interface.py +0 -9
- egse/fdir/fdir_remote_popup.py +0 -26
- egse/fee/__init__.py +0 -106
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/feesim.py +0 -914
- egse/fee/n_fee_hk.py +0 -768
- egse/fee/nfee.py +0 -188
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -49
- egse/filterwheel/eksma/fw8smc4.py +0 -657
- egse/filterwheel/eksma/fw8smc4.yaml +0 -121
- egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
- egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
- egse/filterwheel/eksma/fw8smc4_protocol.py +0 -82
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -115
- egse/filterwheel/eksma/fw8smc5.yaml +0 -105
- egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
- egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
- egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
- egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
- egse/filterwheel/eksma/fw8smc5_ui.py +0 -1065
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -710
- egse/fov/fov_ui.py +0 -859
- egse/fov/fov_ui_controller.py +0 -140
- egse/fov/fov_ui_model.py +0 -200
- egse/fov/fov_ui_view.py +0 -345
- egse/gimbal/__init__.py +0 -32
- egse/gimbal/symetrie/__init__.py +0 -26
- egse/gimbal/symetrie/alpha.py +0 -586
- egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
- egse/gimbal/symetrie/gimbal.py +0 -877
- egse/gimbal/symetrie/gimbal.yaml +0 -168
- egse/gimbal/symetrie/gimbal_cs.py +0 -183
- egse/gimbal/symetrie/gimbal_protocol.py +0 -138
- egse/gimbal/symetrie/gimbal_ui.py +0 -361
- egse/gimbal/symetrie/pmac.py +0 -1006
- egse/gimbal/symetrie/pmac_regex.py +0 -83
- egse/graph.py +0 -132
- egse/gui/__init__.py +0 -47
- egse/gui/buttons.py +0 -378
- egse/gui/focalplane.py +0 -1285
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -587
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- egse/gui/styles.qss +0 -48
- egse/gui/switch.py +0 -112
- egse/h5.py +0 -274
- egse/help/__init__.py +0 -0
- egse/help/help_ui.py +0 -126
- egse/hexapod/__init__.py +0 -32
- egse/hexapod/symetrie/__init__.py +0 -137
- egse/hexapod/symetrie/alpha.py +0 -874
- egse/hexapod/symetrie/dynalpha.py +0 -1387
- egse/hexapod/symetrie/hexapod_ui.py +0 -1516
- egse/hexapod/symetrie/pmac.py +0 -1010
- egse/hexapod/symetrie/pmac_regex.py +0 -83
- egse/hexapod/symetrie/puna.py +0 -1167
- egse/hexapod/symetrie/puna.yaml +0 -193
- egse/hexapod/symetrie/puna_cs.py +0 -195
- egse/hexapod/symetrie/puna_protocol.py +0 -134
- egse/hexapod/symetrie/puna_ui.py +0 -433
- egse/hexapod/symetrie/punaplus.py +0 -107
- egse/hexapod/symetrie/zonda.py +0 -872
- egse/hexapod/symetrie/zonda.yaml +0 -337
- egse/hexapod/symetrie/zonda_cs.py +0 -172
- egse/hexapod/symetrie/zonda_devif.py +0 -414
- egse/hexapod/symetrie/zonda_protocol.py +0 -123
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -791
- egse/icons/aeu-cs-start.svg +0 -117
- egse/icons/aeu-cs-stop.svg +0 -118
- egse/icons/aeu-cs.svg +0 -107
- egse/icons/aeu_cs-started.svg +0 -112
- egse/icons/aeu_cs-stopped.svg +0 -112
- egse/icons/aeu_cs.svg +0 -55
- egse/icons/alert.svg +0 -1
- egse/icons/arrow-double-left.png +0 -0
- egse/icons/arrow-double-right.png +0 -0
- egse/icons/arrow-up.svg +0 -11
- egse/icons/backward.svg +0 -1
- egse/icons/busy.svg +0 -1
- egse/icons/cleaning.svg +0 -115
- egse/icons/color-scheme.svg +0 -1
- egse/icons/cs-connected-alert.svg +0 -91
- egse/icons/cs-connected-disabled.svg +0 -43
- egse/icons/cs-connected.svg +0 -89
- egse/icons/cs-not-connected.svg +0 -44
- egse/icons/double-left-arrow.svg +0 -1
- egse/icons/double-right-arrow.svg +0 -1
- egse/icons/erase-disabled.svg +0 -19
- egse/icons/erase.svg +0 -59
- egse/icons/fitsgen-start.svg +0 -47
- egse/icons/fitsgen-stop.svg +0 -48
- egse/icons/fitsgen.svg +0 -1
- egse/icons/forward.svg +0 -1
- egse/icons/fov-hk-start.svg +0 -33
- egse/icons/fov-hk-stop.svg +0 -37
- egse/icons/fov-hk.svg +0 -1
- egse/icons/front-desk.svg +0 -1
- egse/icons/home-actioned.svg +0 -15
- egse/icons/home-disabled.svg +0 -15
- egse/icons/home.svg +0 -13
- egse/icons/info.svg +0 -1
- egse/icons/invalid.png +0 -0
- egse/icons/led-green.svg +0 -20
- egse/icons/led-grey.svg +0 -20
- egse/icons/led-orange.svg +0 -20
- egse/icons/led-red.svg +0 -20
- egse/icons/led-square-green.svg +0 -134
- egse/icons/led-square-grey.svg +0 -134
- egse/icons/led-square-orange.svg +0 -134
- egse/icons/led-square-red.svg +0 -134
- egse/icons/limit-switch-all-green.svg +0 -115
- egse/icons/limit-switch-all-red.svg +0 -117
- egse/icons/limit-switch-el+.svg +0 -116
- egse/icons/limit-switch-el-.svg +0 -117
- egse/icons/location-marker.svg +0 -1
- egse/icons/logo-dpu.svg +0 -48
- egse/icons/logo-gimbal.svg +0 -112
- egse/icons/logo-huber.svg +0 -23
- egse/icons/logo-ogse.svg +0 -31
- egse/icons/logo-puna.svg +0 -92
- egse/icons/logo-tcs.svg +0 -29
- egse/icons/logo-zonda.svg +0 -66
- egse/icons/maximize.svg +0 -1
- egse/icons/meter.svg +0 -1
- egse/icons/more.svg +0 -45
- egse/icons/n-fee-hk-start.svg +0 -24
- egse/icons/n-fee-hk-stop.svg +0 -25
- egse/icons/n-fee-hk.svg +0 -83
- egse/icons/observing-off.svg +0 -46
- egse/icons/observing-on.svg +0 -46
- egse/icons/open-document-hdf5.png +0 -0
- egse/icons/open-document-hdf5.svg +0 -21
- egse/icons/ops-mode.svg +0 -1
- egse/icons/play-green.svg +0 -17
- egse/icons/plugged-disabled.svg +0 -27
- egse/icons/plugged.svg +0 -21
- egse/icons/pm_ui.svg +0 -1
- egse/icons/power-button-green.svg +0 -27
- egse/icons/power-button-red.svg +0 -27
- egse/icons/power-button.svg +0 -27
- egse/icons/radar.svg +0 -1
- egse/icons/radioactive.svg +0 -2
- egse/icons/reload.svg +0 -1
- egse/icons/remote-control-off.svg +0 -28
- egse/icons/remote-control-on.svg +0 -28
- egse/icons/repeat-blue.svg +0 -15
- egse/icons/repeat.svg +0 -1
- egse/icons/settings.svg +0 -1
- egse/icons/shrink.svg +0 -1
- egse/icons/shutter.svg +0 -1
- egse/icons/sign-off.svg +0 -1
- egse/icons/sign-on.svg +0 -1
- egse/icons/sim-mode.svg +0 -1
- egse/icons/small-buttons-go.svg +0 -20
- egse/icons/small-buttons-minus.svg +0 -51
- egse/icons/small-buttons-plus.svg +0 -51
- egse/icons/sponge.svg +0 -220
- egse/icons/start-button-disabled.svg +0 -84
- egse/icons/start-button.svg +0 -50
- egse/icons/stop-button-disabled.svg +0 -84
- egse/icons/stop-button.svg +0 -50
- egse/icons/stop-red.svg +0 -17
- egse/icons/stop.svg +0 -1
- egse/icons/switch-disabled-square.svg +0 -87
- egse/icons/switch-disabled.svg +0 -15
- egse/icons/switch-off-square.svg +0 -87
- egse/icons/switch-off.svg +0 -72
- egse/icons/switch-on-square.svg +0 -87
- egse/icons/switch-on.svg +0 -61
- egse/icons/temperature-control.svg +0 -44
- egse/icons/th_ui_logo.svg +0 -1
- egse/icons/unplugged.svg +0 -23
- egse/icons/unvalid.png +0 -0
- egse/icons/user-interface.svg +0 -1
- egse/icons/vacuum.svg +0 -1
- egse/icons/valid.png +0 -0
- egse/icons/zoom-to-pixel-dark.svg +0 -64
- egse/icons/zoom-to-pixel-white.svg +0 -36
- egse/images/big-rotation-stage.png +0 -0
- egse/images/connected-100.png +0 -0
- egse/images/cross.svg +0 -6
- egse/images/disconnected-100.png +0 -0
- egse/images/gui-icon.png +0 -0
- egse/images/home.svg +0 -6
- egse/images/info-icon.png +0 -0
- egse/images/led-black.svg +0 -89
- egse/images/led-green.svg +0 -85
- egse/images/led-orange.svg +0 -85
- egse/images/led-red.svg +0 -85
- egse/images/load-icon.png +0 -0
- egse/images/load-setup.png +0 -0
- egse/images/load.png +0 -0
- egse/images/pause.png +0 -0
- egse/images/play-button.svg +0 -8
- egse/images/play.png +0 -0
- egse/images/process-status.png +0 -0
- egse/images/restart.png +0 -0
- egse/images/search.png +0 -0
- egse/images/sma.png +0 -0
- egse/images/start.png +0 -0
- egse/images/stop-button.svg +0 -8
- egse/images/stop.png +0 -0
- egse/images/switch-off.svg +0 -48
- egse/images/switch-on.svg +0 -48
- egse/images/undo.png +0 -0
- egse/images/update-button.svg +0 -11
- egse/imageviewer/exposureselection.py +0 -475
- egse/imageviewer/imageviewer.py +0 -198
- egse/imageviewer/matchfocalplane.py +0 -179
- egse/imageviewer/subfieldposition.py +0 -133
- egse/lampcontrol/__init__.py +0 -4
- egse/lampcontrol/beaglebone/beaglebone.py +0 -178
- egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
- egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
- egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
- egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
- egse/lampcontrol/energetiq/__init__.py +0 -22
- egse/lampcontrol/energetiq/eq99.yaml +0 -98
- egse/lampcontrol/energetiq/lampEQ99.py +0 -283
- egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
- egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
- egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
- egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -71
- egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
- egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
- egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
- egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
- egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
- egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
- egse/lib/ximc/libximc.framework/libbindy.so +0 -0
- egse/lib/ximc/libximc.framework/libximc +0 -0
- egse/lib/ximc/libximc.framework/libximc.so +0 -0
- egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
- egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
- egse/lib/ximc/pyximc.py +0 -922
- egse/listener.py +0 -179
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -102
- egse/mixin.py +0 -464
- egse/monitoring.py +0 -95
- egse/ni/alarms/__init__.py +0 -26
- egse/ni/alarms/cdaq9375.py +0 -300
- egse/ni/alarms/cdaq9375.yaml +0 -89
- egse/ni/alarms/cdaq9375_cs.py +0 -130
- egse/ni/alarms/cdaq9375_devif.py +0 -183
- egse/ni/alarms/cdaq9375_protocol.py +0 -48
- egse/obs_inspection.py +0 -165
- egse/observer.py +0 -41
- egse/obsid.py +0 -163
- egse/powermeter/__init__.py +0 -0
- egse/powermeter/ni/__init__.py +0 -38
- egse/powermeter/ni/cdaq9184.py +0 -224
- egse/powermeter/ni/cdaq9184.yaml +0 -73
- egse/powermeter/ni/cdaq9184_cs.py +0 -130
- egse/powermeter/ni/cdaq9184_devif.py +0 -201
- egse/powermeter/ni/cdaq9184_protocol.py +0 -48
- egse/powermeter/ni/cdaq9184_ui.py +0 -544
- egse/powermeter/thorlabs/__init__.py +0 -25
- egse/powermeter/thorlabs/pm100a.py +0 -380
- egse/powermeter/thorlabs/pm100a.yaml +0 -132
- egse/powermeter/thorlabs/pm100a_cs.py +0 -136
- egse/powermeter/thorlabs/pm100a_devif.py +0 -127
- egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
- egse/powermeter/thorlabs/pm100a_ui.py +0 -725
- egse/process.py +0 -451
- egse/procman/__init__.py +0 -834
- egse/procman/cannot_start_process_popup.py +0 -43
- egse/procman/procman.yaml +0 -49
- egse/procman/procman_cs.py +0 -201
- egse/procman/procman_ui.py +0 -2081
- egse/protocol.py +0 -605
- egse/proxy.py +0 -531
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -693
- egse/resource.py +0 -333
- egse/rmap.py +0 -406
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -247
- egse/services.yaml +0 -68
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1181
- egse/shutter/__init__.py +0 -0
- egse/shutter/thorlabs/__init__.py +0 -19
- egse/shutter/thorlabs/ksc101.py +0 -205
- egse/shutter/thorlabs/ksc101.yaml +0 -105
- egse/shutter/thorlabs/ksc101_cs.py +0 -136
- egse/shutter/thorlabs/ksc101_devif.py +0 -201
- egse/shutter/thorlabs/ksc101_protocol.py +0 -71
- egse/shutter/thorlabs/ksc101_ui.py +0 -548
- egse/shutter/thorlabs/sc10.py +0 -82
- egse/shutter/thorlabs/sc10.yaml +0 -52
- egse/shutter/thorlabs/sc10_controller.py +0 -81
- egse/shutter/thorlabs/sc10_cs.py +0 -108
- egse/shutter/thorlabs/sc10_interface.py +0 -25
- egse/shutter/thorlabs/sc10_simulator.py +0 -30
- egse/simulator.py +0 -41
- egse/slack.py +0 -61
- egse/socketdevice.py +0 -218
- egse/sockets.py +0 -218
- egse/spw.py +0 -1401
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -245
- egse/stages/aerotech/ensemble.yaml +0 -205
- egse/stages/aerotech/ensemble_controller.py +0 -275
- egse/stages/aerotech/ensemble_cs.py +0 -110
- egse/stages/aerotech/ensemble_interface.py +0 -132
- egse/stages/aerotech/ensemble_parameters.py +0 -433
- egse/stages/aerotech/ensemble_simulator.py +0 -27
- egse/stages/aerotech/mgse_sim.py +0 -188
- egse/stages/arun/smd3.py +0 -110
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -470
- egse/stages/arun/smd3_cs.py +0 -112
- egse/stages/arun/smd3_interface.py +0 -53
- egse/stages/arun/smd3_simulator.py +0 -27
- egse/stages/arun/smd3_stop.py +0 -16
- egse/stages/huber/__init__.py +0 -49
- egse/stages/huber/smc9300.py +0 -920
- egse/stages/huber/smc9300.yaml +0 -63
- egse/stages/huber/smc9300_cs.py +0 -178
- egse/stages/huber/smc9300_devif.py +0 -345
- egse/stages/huber/smc9300_protocol.py +0 -113
- egse/stages/huber/smc9300_sim.py +0 -547
- egse/stages/huber/smc9300_ui.py +0 -973
- egse/state.py +0 -173
- egse/statemachine.py +0 -274
- egse/storage/__init__.py +0 -1067
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -79
- egse/storage/storage_cs.py +0 -231
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -417
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1611
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -879
- egse/tcs/tcs.yaml +0 -14
- egse/tcs/tcs_cs.py +0 -202
- egse/tcs/tcs_devif.py +0 -292
- egse/tcs/tcs_protocol.py +0 -180
- egse/tcs/tcs_sim.py +0 -177
- egse/tcs/tcs_ui.py +0 -543
- egse/tdms.py +0 -171
- egse/tempcontrol/__init__.py +0 -23
- egse/tempcontrol/agilent/agilent34970.py +0 -109
- egse/tempcontrol/agilent/agilent34970.yaml +0 -44
- egse/tempcontrol/agilent/agilent34970_cs.py +0 -114
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -96
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -115
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -98
- egse/tempcontrol/beaglebone/beaglebone.py +0 -341
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -134
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -674
- egse/tempcontrol/digalox/digalox.py +0 -115
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -108
- egse/tempcontrol/digalox/digalox_protocol.py +0 -56
- egse/tempcontrol/keithley/__init__.py +0 -33
- egse/tempcontrol/keithley/daq6510.py +0 -662
- egse/tempcontrol/keithley/daq6510.yaml +0 -105
- egse/tempcontrol/keithley/daq6510_cs.py +0 -163
- egse/tempcontrol/keithley/daq6510_devif.py +0 -343
- egse/tempcontrol/keithley/daq6510_protocol.py +0 -79
- egse/tempcontrol/keithley/daq6510_sim.py +0 -186
- egse/tempcontrol/lakeshore/__init__.py +0 -33
- egse/tempcontrol/lakeshore/lsci.py +0 -361
- egse/tempcontrol/lakeshore/lsci.yaml +0 -162
- egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
- egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
- egse/tempcontrol/lakeshore/lsci_protocol.py +0 -76
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -387
- egse/tempcontrol/ni/__init__.py +0 -0
- egse/tempcontrol/spid/spid.py +0 -109
- egse/tempcontrol/spid/spid.yaml +0 -81
- egse/tempcontrol/spid/spid_controller.py +0 -279
- egse/tempcontrol/spid/spid_cs.py +0 -136
- egse/tempcontrol/spid/spid_protocol.py +0 -107
- egse/tempcontrol/spid/spid_ui.py +0 -723
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -867
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -116
- egse/tempcontrol/srs/ptc10_protocol.py +0 -39
- egse/tempcontrol/srs/ptc10_ui.py +0 -906
- egse/ups/apc/apc.py +0 -236
- egse/ups/apc/apc.yaml +0 -45
- egse/ups/apc/apc_cs.py +0 -101
- egse/ups/apc/apc_protocol.py +0 -125
- egse/user.yaml +0 -7
- egse/vacuum/beaglebone/beaglebone.py +0 -149
- egse/vacuum/beaglebone/beaglebone.yaml +0 -44
- egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
- egse/vacuum/beaglebone/beaglebone_devif.py +0 -159
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -192
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -91
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -124
- egse/vacuum/instrutech/igm402_cs.py +0 -108
- egse/vacuum/instrutech/igm402_interface.py +0 -49
- egse/vacuum/instrutech/igm402_simulator.py +0 -36
- egse/vacuum/keller/kellerBus.py +0 -256
- egse/vacuum/keller/leo3.py +0 -100
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -81
- egse/vacuum/keller/leo3_cs.py +0 -101
- egse/vacuum/keller/leo3_interface.py +0 -33
- egse/vacuum/mks/evision.py +0 -86
- egse/vacuum/mks/evision.yaml +0 -75
- egse/vacuum/mks/evision_cs.py +0 -101
- egse/vacuum/mks/evision_devif.py +0 -313
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -701
- egse/vacuum/pfeiffer/acp40.py +0 -87
- egse/vacuum/pfeiffer/acp40.yaml +0 -60
- egse/vacuum/pfeiffer/acp40_controller.py +0 -117
- egse/vacuum/pfeiffer/acp40_cs.py +0 -109
- egse/vacuum/pfeiffer/acp40_interface.py +0 -40
- egse/vacuum/pfeiffer/acp40_simulator.py +0 -37
- egse/vacuum/pfeiffer/tc400.py +0 -87
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -136
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -35
- egse/vacuum/pfeiffer/tpg261.py +0 -80
- egse/vacuum/pfeiffer/tpg261.yaml +0 -66
- egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
- egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
- egse/vacuum/pfeiffer/tpg261_interface.py +0 -59
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -23
- egse/version.py +0 -174
- egse/visitedpositions.py +0 -398
- egse/windowing.py +0 -213
- egse/zmq/__init__.py +0 -28
- egse/zmq/spw.py +0 -160
- egse/zmq_ser.py +0 -41
- scripts/alerts/cold.yaml +0 -278
- scripts/alerts/example_alerts.yaml +0 -54
- scripts/alerts/transition.yaml +0 -14
- scripts/alerts/warm.yaml +0 -49
- scripts/analyse_n_fee_hk_data.py +0 -52
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/check_tcs_calib_coef.py +0 -90
- scripts/correct_ccd_cold_temperature_cal.py +0 -157
- scripts/create_hdf5_report.py +0 -293
- scripts/csl_model.py +0 -420
- scripts/csl_restore_setup.py +0 -229
- scripts/export-grafana-dashboards.py +0 -49
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -54
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -10
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -61
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -59
- scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
- scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
- scripts/fix_csv.py +0 -80
- scripts/ias/correct_ccd_temp_cal_elfique.py +0 -43
- scripts/ias/correct_ccd_temp_cal_floreffe.py +0 -43
- scripts/ias/correct_trp_swap_achel.py +0 -199
- scripts/inta/correct_ccd_temp_cal_duvel.py +0 -43
- scripts/inta/correct_ccd_temp_cal_gueuze.py +0 -43
- scripts/n_fee_supply_voltage_calculation.py +0 -92
- scripts/playground.py +0 -30
- scripts/print_hdf5_hk_data.py +0 -68
- scripts/print_register_map.py +0 -43
- scripts/remove_lines_between_matches.py +0 -188
- scripts/sron/commanding/control_heaters.py +0 -44
- scripts/sron/commanding/pumpdown.py +0 -46
- scripts/sron/commanding/set_pid_setpoint.py +0 -19
- scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
- scripts/sron/commanding/shutdown_pumps.py +0 -33
- scripts/sron/correct_mgse_coordinates_brigand_chimay.py +0 -272
- scripts/sron/correct_trp_swap_brigand.py +0 -204
- scripts/sron/gimbal_conversions.py +0 -75
- scripts/sron/tm_gen/tm_gen_agilent.py +0 -37
- scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
- scripts/sron/tm_gen/tm_gen_spid.py +0 -13
- scripts/update_operational_cgse.py +0 -268
- scripts/update_operational_cgse_old.py +0 -273
egse/collimator/fcul/ogse.yaml
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
BaseClass:
|
|
2
|
-
egse.collimator.fcul.OGSEInterface
|
|
3
|
-
|
|
4
|
-
ProxyClass:
|
|
5
|
-
egse.collimator.fcul.OGSEProxy
|
|
6
|
-
|
|
7
|
-
ControlServerClass:
|
|
8
|
-
egse.collimator.fcul.ogse_cs.OGSEControlServer
|
|
9
|
-
|
|
10
|
-
ControlServer:
|
|
11
|
-
egse.collimator.fcul.ogse_cs
|
|
12
|
-
|
|
13
|
-
UserInterface:
|
|
14
|
-
egse.collimator.fcul.ogse_ui
|
egse/collimator/fcul/ogse_cs.py
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module defines the control server for the OGSE.
|
|
3
|
-
"""
|
|
4
|
-
import logging
|
|
5
|
-
import multiprocessing
|
|
6
|
-
import sys
|
|
7
|
-
|
|
8
|
-
multiprocessing.current_process().name = "ogse_cs"
|
|
9
|
-
|
|
10
|
-
import click
|
|
11
|
-
import invoke
|
|
12
|
-
import zmq
|
|
13
|
-
from prometheus_client import start_http_server
|
|
14
|
-
|
|
15
|
-
from egse.collimator.fcul.ogse import OGSEProxy
|
|
16
|
-
from egse.collimator.fcul.ogse_protocol import OGSEProtocol
|
|
17
|
-
from egse.control import ControlServer
|
|
18
|
-
from egse.control import is_control_server_active
|
|
19
|
-
from egse.settings import Settings
|
|
20
|
-
from egse.zmq_ser import connect_address
|
|
21
|
-
|
|
22
|
-
# Use explicit name here otherwise the logger will probably be called __main__
|
|
23
|
-
|
|
24
|
-
logger = logging.getLogger("egse.collimator.fcul.ogse_cs")
|
|
25
|
-
|
|
26
|
-
CTRL_SETTINGS = Settings.load("OGSE Control Server")
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class OGSEControlServer(ControlServer):
|
|
30
|
-
def __init__(self):
|
|
31
|
-
super().__init__()
|
|
32
|
-
|
|
33
|
-
self.device_protocol = OGSEProtocol(self)
|
|
34
|
-
|
|
35
|
-
self.logger.info(f"Binding ZeroMQ socket to {self.device_protocol.get_bind_address()}")
|
|
36
|
-
|
|
37
|
-
self.device_protocol.bind(self.dev_ctrl_cmd_sock)
|
|
38
|
-
|
|
39
|
-
self.poller.register(self.dev_ctrl_cmd_sock, zmq.POLLIN)
|
|
40
|
-
|
|
41
|
-
self.set_delay(CTRL_SETTINGS.ST_DELAY)
|
|
42
|
-
self.set_hk_delay(CTRL_SETTINGS.HK_DELAY)
|
|
43
|
-
|
|
44
|
-
def get_communication_protocol(self):
|
|
45
|
-
return CTRL_SETTINGS.PROTOCOL
|
|
46
|
-
|
|
47
|
-
def get_commanding_port(self):
|
|
48
|
-
return CTRL_SETTINGS.COMMANDING_PORT
|
|
49
|
-
|
|
50
|
-
def get_service_port(self):
|
|
51
|
-
return CTRL_SETTINGS.SERVICE_PORT
|
|
52
|
-
|
|
53
|
-
def get_monitoring_port(self):
|
|
54
|
-
return CTRL_SETTINGS.MONITORING_PORT
|
|
55
|
-
|
|
56
|
-
def get_storage_mnemonic(self):
|
|
57
|
-
try:
|
|
58
|
-
return CTRL_SETTINGS.STORAGE_MNEMONIC
|
|
59
|
-
except AttributeError:
|
|
60
|
-
return "OGSE"
|
|
61
|
-
|
|
62
|
-
def before_serve(self):
|
|
63
|
-
start_http_server(CTRL_SETTINGS.METRICS_PORT)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
@click.group()
|
|
67
|
-
def cli():
|
|
68
|
-
pass
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
@cli.command()
|
|
72
|
-
@click.option(
|
|
73
|
-
"--simulator", "--sim", is_flag=True, help="Start the OGSE Simulator as the backend."
|
|
74
|
-
)
|
|
75
|
-
def start(simulator):
|
|
76
|
-
"""
|
|
77
|
-
Starts the OGSE Control Server (ogse_cs). The ogse_cs is a device server which handles the
|
|
78
|
-
commanding of the OGSE at CSL.
|
|
79
|
-
"""
|
|
80
|
-
|
|
81
|
-
if simulator:
|
|
82
|
-
Settings.set_simulation_mode(True)
|
|
83
|
-
|
|
84
|
-
try:
|
|
85
|
-
control_server = OGSEControlServer()
|
|
86
|
-
control_server.serve()
|
|
87
|
-
except KeyboardInterrupt:
|
|
88
|
-
print("Shutdown requested...exiting")
|
|
89
|
-
except SystemExit as exit_code:
|
|
90
|
-
print(f"System Exit with code {exit_code}.")
|
|
91
|
-
sys.exit(exit_code)
|
|
92
|
-
except (Exception, ) as exc: # ignore: too broad exception clause
|
|
93
|
-
logger.error(f"Caught Exception: {exc}", exc_info=True)
|
|
94
|
-
|
|
95
|
-
# import traceback
|
|
96
|
-
# traceback.print_exc(file=sys.stdout)
|
|
97
|
-
|
|
98
|
-
return 0
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
@cli.command()
|
|
102
|
-
@click.option(
|
|
103
|
-
"--simulator", "--sim", is_flag=True, help="Start the OGSE Simulator as the backend."
|
|
104
|
-
)
|
|
105
|
-
def start_bg(simulator):
|
|
106
|
-
"""Start the OGSE Control Server in the background."""
|
|
107
|
-
sim = "--simulator" if simulator else ""
|
|
108
|
-
invoke.run(f"ogse_cs start {sim}", disown=True)
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
@cli.command()
|
|
112
|
-
def stop():
|
|
113
|
-
"""Send a 'quit_server' command to the OGSE Control Server."""
|
|
114
|
-
import rich
|
|
115
|
-
|
|
116
|
-
if is_control_server_active(connect_address(CTRL_SETTINGS.PROTOCOL,
|
|
117
|
-
CTRL_SETTINGS.HOSTNAME,
|
|
118
|
-
CTRL_SETTINGS.COMMANDING_PORT)):
|
|
119
|
-
with OGSEProxy() as ogse:
|
|
120
|
-
sp = ogse.get_service_proxy()
|
|
121
|
-
sp.quit_server()
|
|
122
|
-
else:
|
|
123
|
-
rich.print("[red]OGSE Control Server is not replying, check if the server is running.")
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
@cli.command()
|
|
127
|
-
def status():
|
|
128
|
-
"""Print the status of the control server."""
|
|
129
|
-
|
|
130
|
-
from rich import print
|
|
131
|
-
|
|
132
|
-
print('OGSE Control Server:')
|
|
133
|
-
|
|
134
|
-
if is_control_server_active(connect_address(CTRL_SETTINGS.PROTOCOL,
|
|
135
|
-
CTRL_SETTINGS.HOSTNAME,
|
|
136
|
-
CTRL_SETTINGS.COMMANDING_PORT)):
|
|
137
|
-
print(' Status: [green]active')
|
|
138
|
-
with OGSEProxy() as ogse:
|
|
139
|
-
try:
|
|
140
|
-
print(f" Version: {ogse.version()}")
|
|
141
|
-
except AttributeError:
|
|
142
|
-
print(' Version: [red]UNKNOWN')
|
|
143
|
-
|
|
144
|
-
print(f" Hostname: {ogse.get_ip_address()}")
|
|
145
|
-
print(f" Monitoring port: {ogse.get_monitoring_port()}")
|
|
146
|
-
print(f" Commanding port: {ogse.get_commanding_port()}")
|
|
147
|
-
print(f" Service port: {ogse.get_service_port()}")
|
|
148
|
-
else:
|
|
149
|
-
print(' Status: [red]not active')
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if __name__ == "__main__":
|
|
153
|
-
|
|
154
|
-
sys.exit(cli())
|
|
@@ -1,358 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
The device interface for the RT-OGSE that will be used at CSL for alignment of the PLATO Cameras.
|
|
3
|
-
|
|
4
|
-
"""
|
|
5
|
-
import logging
|
|
6
|
-
import socket
|
|
7
|
-
import time
|
|
8
|
-
|
|
9
|
-
from egse.device import DeviceConnectionError
|
|
10
|
-
from egse.device import DeviceConnectionInterface
|
|
11
|
-
from egse.device import DeviceTimeoutError
|
|
12
|
-
from egse.device import DeviceTransport
|
|
13
|
-
from egse.settings import Settings
|
|
14
|
-
from egse.system import format_datetime, Timer
|
|
15
|
-
|
|
16
|
-
logger = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
|
-
READ_TIMEOUT = 10.0 # seconds
|
|
19
|
-
WRITE_TIMEOUT = 1.0 # seconds
|
|
20
|
-
CONNECT_TIMEOUT = 3.0 # seconds
|
|
21
|
-
|
|
22
|
-
CTRL_SETTINGS = Settings.load("OGSE Controller")
|
|
23
|
-
DEVICE_NAME = "OGSE"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class OGSEError(Exception):
|
|
27
|
-
"""Generic Error for the OGSE low-level classes."""
|
|
28
|
-
|
|
29
|
-
pass
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class OGSEEthernetInterface(DeviceConnectionInterface, DeviceTransport):
|
|
33
|
-
"""Defines the low-level interface to the OGSE Controller."""
|
|
34
|
-
|
|
35
|
-
def __init__(self, hostname=None, port=None):
|
|
36
|
-
"""
|
|
37
|
-
Args:
|
|
38
|
-
hostname (str): the IP address or fully qualified hostname of the OGSE hardware
|
|
39
|
-
controller. The default is defined in the ``settings.yaml`` configuration file.
|
|
40
|
-
|
|
41
|
-
port (int): the IP port number to connect to. The default is defined in the
|
|
42
|
-
`settings.yaml` configuration file.
|
|
43
|
-
"""
|
|
44
|
-
super().__init__()
|
|
45
|
-
self.hostname = hostname or CTRL_SETTINGS.HOSTNAME
|
|
46
|
-
self.port = port or CTRL_SETTINGS.PORT
|
|
47
|
-
self.sock = None
|
|
48
|
-
|
|
49
|
-
self.is_connection_open = False
|
|
50
|
-
|
|
51
|
-
def connect(self):
|
|
52
|
-
"""
|
|
53
|
-
Connect the OGSE device.
|
|
54
|
-
|
|
55
|
-
Raises:
|
|
56
|
-
DeviceConnectionError when the connection could not be established. Check the logging
|
|
57
|
-
messages for more detail.
|
|
58
|
-
|
|
59
|
-
DeviceTimeoutError: When the connection timed out.
|
|
60
|
-
|
|
61
|
-
ValueError: When hostname or port number are not provided.
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
# Sanity checks
|
|
65
|
-
|
|
66
|
-
if self.is_connection_open:
|
|
67
|
-
logger.warning(f"{DEVICE_NAME}: trying to connect to an already connected socket.")
|
|
68
|
-
return
|
|
69
|
-
|
|
70
|
-
if self.hostname in (None, ""):
|
|
71
|
-
raise ValueError(f"{DEVICE_NAME}: hostname is not initialized.")
|
|
72
|
-
|
|
73
|
-
if self.port in (None, 0):
|
|
74
|
-
raise ValueError(f"{DEVICE_NAME}: port number is not initialized.")
|
|
75
|
-
|
|
76
|
-
# Create a new socket instance
|
|
77
|
-
|
|
78
|
-
try:
|
|
79
|
-
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
80
|
-
except socket.error as e_socket:
|
|
81
|
-
raise DeviceConnectionError(DEVICE_NAME, "Failed to create socket.") from e_socket
|
|
82
|
-
|
|
83
|
-
# Attempt to establish a connection to the remote host
|
|
84
|
-
|
|
85
|
-
# FIXME: Socket shall be closed on exception?
|
|
86
|
-
|
|
87
|
-
# We set a timeout of CONNECT_TIMEOUT sec before connecting and reset to None
|
|
88
|
-
# (=blocking) after the connect. The reason for this is because when no
|
|
89
|
-
# device is available, e.g during testing, the timeout will take about
|
|
90
|
-
# two minutes which is way too long. It needs to be evaluated if this
|
|
91
|
-
# approach is acceptable and not causing problems during production.
|
|
92
|
-
|
|
93
|
-
try:
|
|
94
|
-
logger.debug(f'Connecting a socket to host "{self.hostname}" using port {self.port}')
|
|
95
|
-
self.sock.settimeout(CONNECT_TIMEOUT)
|
|
96
|
-
self.sock.connect((self.hostname, self.port))
|
|
97
|
-
self.sock.settimeout(None)
|
|
98
|
-
except ConnectionRefusedError as exc:
|
|
99
|
-
raise DeviceConnectionError(
|
|
100
|
-
DEVICE_NAME, f"Connection refused to {self.hostname}:{self.port}."
|
|
101
|
-
) from exc
|
|
102
|
-
except TimeoutError as exc:
|
|
103
|
-
raise DeviceTimeoutError(
|
|
104
|
-
DEVICE_NAME, f"Connection to {self.hostname}:{self.port} timed out."
|
|
105
|
-
) from exc
|
|
106
|
-
except socket.gaierror as exc:
|
|
107
|
-
raise DeviceConnectionError(
|
|
108
|
-
DEVICE_NAME, f"socket address info error for {self.hostname}"
|
|
109
|
-
) from exc
|
|
110
|
-
except socket.herror as exc:
|
|
111
|
-
raise DeviceConnectionError(
|
|
112
|
-
DEVICE_NAME, f"socket host address error for {self.hostname}"
|
|
113
|
-
) from exc
|
|
114
|
-
except socket.timeout as exc:
|
|
115
|
-
raise DeviceTimeoutError(
|
|
116
|
-
DEVICE_NAME, f"socket timeout error for {self.hostname}:{self.port}"
|
|
117
|
-
) from exc
|
|
118
|
-
except OSError as exc:
|
|
119
|
-
raise DeviceConnectionError(DEVICE_NAME, f"OSError caught ({exc}).") from exc
|
|
120
|
-
|
|
121
|
-
self.is_connection_open = True
|
|
122
|
-
|
|
123
|
-
# The OGSE will respond with a message when connecting. We have to read this
|
|
124
|
-
# message from the buffer and can do some version checking if needed.
|
|
125
|
-
|
|
126
|
-
response = self.read()
|
|
127
|
-
|
|
128
|
-
# The expected response has the following format: b'This is PLATO RT-OGSE 2.1\n'
|
|
129
|
-
|
|
130
|
-
if b"PLATO RT-OGSE" in response:
|
|
131
|
-
version = response.rsplit(maxsplit=1)[-1]
|
|
132
|
-
logger.info(f"Connected to the PLATO RT-OGSE, {version=}")
|
|
133
|
-
else:
|
|
134
|
-
logger.warning(f"Unexpected response after connecting to the RT-OGSE. {response=}")
|
|
135
|
-
|
|
136
|
-
def disconnect(self):
|
|
137
|
-
"""Disconnect from the Ethernet connection.
|
|
138
|
-
|
|
139
|
-
Raises:
|
|
140
|
-
DeviceConnectionError when the socket could not be closed.
|
|
141
|
-
"""
|
|
142
|
-
|
|
143
|
-
try:
|
|
144
|
-
if self.is_connection_open:
|
|
145
|
-
logger.debug(f"Disconnecting from {self.hostname}")
|
|
146
|
-
self.sock.close()
|
|
147
|
-
self.is_connection_open = False
|
|
148
|
-
except Exception as e_exc:
|
|
149
|
-
raise DeviceConnectionError(
|
|
150
|
-
DEVICE_NAME, f"Could not close socket to {self.hostname}") from e_exc
|
|
151
|
-
|
|
152
|
-
def reconnect(self):
|
|
153
|
-
|
|
154
|
-
if self.is_connection_open:
|
|
155
|
-
self.disconnect()
|
|
156
|
-
self.connect()
|
|
157
|
-
|
|
158
|
-
def is_connected(self) -> bool:
|
|
159
|
-
"""
|
|
160
|
-
Check if the device is connected.
|
|
161
|
-
|
|
162
|
-
Returns:
|
|
163
|
-
True is the device is connected, False otherwise.
|
|
164
|
-
"""
|
|
165
|
-
|
|
166
|
-
if not self.is_connection_open:
|
|
167
|
-
return False
|
|
168
|
-
|
|
169
|
-
return True
|
|
170
|
-
|
|
171
|
-
def read(self) -> bytes:
|
|
172
|
-
"""
|
|
173
|
-
Read a response from the device.
|
|
174
|
-
|
|
175
|
-
Returns:
|
|
176
|
-
A bytes object containing the response from the device. No processing is done
|
|
177
|
-
on the response.
|
|
178
|
-
Raises:
|
|
179
|
-
A DeviceTimeoutError when the read operation timed out.
|
|
180
|
-
"""
|
|
181
|
-
idx, n_total = 0, 0
|
|
182
|
-
buf_size = 1024 * 10
|
|
183
|
-
response = bytes()
|
|
184
|
-
|
|
185
|
-
# Set a timeout of READ_TIMEOUT to the socket.recv
|
|
186
|
-
|
|
187
|
-
saved_timeout = self.sock.gettimeout()
|
|
188
|
-
self.sock.settimeout(READ_TIMEOUT)
|
|
189
|
-
|
|
190
|
-
try:
|
|
191
|
-
for idx in range(100):
|
|
192
|
-
# time.sleep(0.1) # Give the device time to fill the buffer
|
|
193
|
-
data = self.sock.recv(buf_size)
|
|
194
|
-
n = len(data)
|
|
195
|
-
n_total += n
|
|
196
|
-
response += data
|
|
197
|
-
if n < buf_size:
|
|
198
|
-
break
|
|
199
|
-
except socket.timeout as e_timeout:
|
|
200
|
-
logger.warning(f"Socket timeout error: {e_timeout}")
|
|
201
|
-
raise DeviceTimeoutError(DEVICE_NAME, "Socket timeout error") from e_timeout
|
|
202
|
-
finally:
|
|
203
|
-
self.sock.settimeout(saved_timeout)
|
|
204
|
-
|
|
205
|
-
# logger.debug(f"Total number of bytes received is {n_total}, idx={idx}")
|
|
206
|
-
# logger.debug(f"> {response[:80]=}")
|
|
207
|
-
|
|
208
|
-
return response
|
|
209
|
-
|
|
210
|
-
def write(self, command: str):
|
|
211
|
-
"""
|
|
212
|
-
Send a command to the device.
|
|
213
|
-
|
|
214
|
-
No processing is done on the command string, except for the encoding into a bytes object.
|
|
215
|
-
|
|
216
|
-
Args:
|
|
217
|
-
command: the command string including terminators.
|
|
218
|
-
|
|
219
|
-
Raises:
|
|
220
|
-
A DeviceTimeoutError when the send timed out, and a DeviceConnectionError if
|
|
221
|
-
there was a socket related error.
|
|
222
|
-
"""
|
|
223
|
-
logger.debug(f"{command=}")
|
|
224
|
-
|
|
225
|
-
try:
|
|
226
|
-
self.sock.sendall(command.encode())
|
|
227
|
-
except socket.timeout as e_timeout:
|
|
228
|
-
raise DeviceTimeoutError(DEVICE_NAME, "Socket timeout error") from e_timeout
|
|
229
|
-
except socket.error as e_socket:
|
|
230
|
-
# Interpret any socket-related error as an I/O error
|
|
231
|
-
raise DeviceConnectionError(DEVICE_NAME, "Socket communication error.") from e_socket
|
|
232
|
-
|
|
233
|
-
def trans(self, command: str) -> bytes:
|
|
234
|
-
"""
|
|
235
|
-
Send a command to the device and wait for the response.
|
|
236
|
-
|
|
237
|
-
No processing is done on the command string, except for the encoding into a bytes object.
|
|
238
|
-
|
|
239
|
-
Args:
|
|
240
|
-
command: the command string including terminators.
|
|
241
|
-
|
|
242
|
-
Returns:
|
|
243
|
-
A bytes object containing the response from the device. No processing is done
|
|
244
|
-
on the response.
|
|
245
|
-
|
|
246
|
-
Raises:
|
|
247
|
-
A DeviceTimeoutError when the send timed out, and a DeviceConnectionError if
|
|
248
|
-
there was a socket related error.
|
|
249
|
-
"""
|
|
250
|
-
# logger.debug(f"{command=}")
|
|
251
|
-
|
|
252
|
-
try:
|
|
253
|
-
# Attempt to send the complete command
|
|
254
|
-
|
|
255
|
-
self.sock.sendall(command.encode())
|
|
256
|
-
|
|
257
|
-
# wait for, read and return the response (will be at most TBD chars)
|
|
258
|
-
|
|
259
|
-
return_string = self.read()
|
|
260
|
-
|
|
261
|
-
return return_string
|
|
262
|
-
|
|
263
|
-
except socket.timeout as e_timeout:
|
|
264
|
-
raise DeviceTimeoutError(DEVICE_NAME, "Socket timeout error") from e_timeout
|
|
265
|
-
except socket.error as e_socket:
|
|
266
|
-
# Interpret any socket-related error as an I/O error
|
|
267
|
-
raise DeviceConnectionError(DEVICE_NAME, "Socket communication error.") from e_socket
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
if __name__ == "__main__":
|
|
271
|
-
|
|
272
|
-
def send_command(cmd):
|
|
273
|
-
cmd = cmd.rstrip()
|
|
274
|
-
with Timer("OGSE Query"):
|
|
275
|
-
response = ogse.query(cmd + "\n")
|
|
276
|
-
print(f"{format_datetime()} Response for {cmd:>20s}: {response.rstrip()}")
|
|
277
|
-
return response
|
|
278
|
-
|
|
279
|
-
def wait_for_att():
|
|
280
|
-
while b'*' in ogse.query("level\n"):
|
|
281
|
-
time.sleep(1)
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
ogse = OGSEEthernetInterface()
|
|
285
|
-
|
|
286
|
-
print("-" * 10, end="")
|
|
287
|
-
print("Connecting to the device.")
|
|
288
|
-
|
|
289
|
-
ogse.connect()
|
|
290
|
-
|
|
291
|
-
print("-"*10, end='')
|
|
292
|
-
print("Requesting all info.")
|
|
293
|
-
|
|
294
|
-
send_command("get flags")
|
|
295
|
-
send_command("get interlock")
|
|
296
|
-
send_command("get power")
|
|
297
|
-
send_command("get lamp")
|
|
298
|
-
send_command("get laser")
|
|
299
|
-
send_command("get lamp-fault")
|
|
300
|
-
send_command("get controller-fault")
|
|
301
|
-
send_command("get psu")
|
|
302
|
-
send_command("get operate")
|
|
303
|
-
send_command("get XXX")
|
|
304
|
-
|
|
305
|
-
print("-"*10, end='')
|
|
306
|
-
print("Requesting lamp status.")
|
|
307
|
-
|
|
308
|
-
send_command("ldls status")
|
|
309
|
-
|
|
310
|
-
print("-"*10, end='')
|
|
311
|
-
print("Playing with attenuator commands")
|
|
312
|
-
|
|
313
|
-
send_command("att status")
|
|
314
|
-
|
|
315
|
-
send_command("level")
|
|
316
|
-
send_command("level 0.1")
|
|
317
|
-
wait_for_att()
|
|
318
|
-
send_command("level up")
|
|
319
|
-
wait_for_att()
|
|
320
|
-
send_command("level")
|
|
321
|
-
send_command("level up")
|
|
322
|
-
wait_for_att()
|
|
323
|
-
send_command("level")
|
|
324
|
-
send_command("level down")
|
|
325
|
-
wait_for_att()
|
|
326
|
-
send_command("level")
|
|
327
|
-
send_command("level down")
|
|
328
|
-
wait_for_att()
|
|
329
|
-
send_command("level")
|
|
330
|
-
send_command("level up")
|
|
331
|
-
wait_for_att()
|
|
332
|
-
send_command("level")
|
|
333
|
-
send_command("level 0.8")
|
|
334
|
-
wait_for_att()
|
|
335
|
-
send_command("level")
|
|
336
|
-
|
|
337
|
-
print("-"*10, end='')
|
|
338
|
-
print("Running through attenuation levels")
|
|
339
|
-
|
|
340
|
-
for a in range(1, 9):
|
|
341
|
-
for b in range(1, 9):
|
|
342
|
-
send_command(f"level {a} {b}")
|
|
343
|
-
wait_for_att()
|
|
344
|
-
send_command("level")
|
|
345
|
-
|
|
346
|
-
print("-"*10, end='')
|
|
347
|
-
print("Request info from Power Meter")
|
|
348
|
-
|
|
349
|
-
send_command("read")
|
|
350
|
-
|
|
351
|
-
print("-"*10, end='')
|
|
352
|
-
print("Request 10 power meter measurements")
|
|
353
|
-
|
|
354
|
-
for _ in range(10):
|
|
355
|
-
send_command("read")
|
|
356
|
-
time.sleep(1)
|
|
357
|
-
|
|
358
|
-
ogse.disconnect()
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
|
|
3
|
-
import sys
|
|
4
|
-
import time
|
|
5
|
-
|
|
6
|
-
from egse.collimator.fcul.ogse import OGSEController
|
|
7
|
-
from egse.collimator.fcul.ogse import OGSEInterface
|
|
8
|
-
from egse.control import ControlServer
|
|
9
|
-
from egse.control import Failure
|
|
10
|
-
from egse.device import DeviceConnectionError
|
|
11
|
-
from egse.device import DeviceTimeoutError
|
|
12
|
-
from egse.metrics import define_metrics
|
|
13
|
-
from egse.metrics import update_metrics
|
|
14
|
-
from egse.process import SubProcess
|
|
15
|
-
from egse.protocol import DynamicCommandProtocol
|
|
16
|
-
from egse.settings import Settings
|
|
17
|
-
from egse.setup import load_setup
|
|
18
|
-
from egse.synoptics import SynopticsManagerProxy
|
|
19
|
-
from egse.system import format_datetime
|
|
20
|
-
|
|
21
|
-
DEVICE_SETTINGS = Settings.load(filename="ogse.yaml")
|
|
22
|
-
SITE = Settings.load("SITE")
|
|
23
|
-
|
|
24
|
-
MODULE_LOGGER = logging.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class OGSEProtocol(DynamicCommandProtocol):
|
|
28
|
-
def __init__(self, control_server: ControlServer):
|
|
29
|
-
super().__init__(control_server)
|
|
30
|
-
|
|
31
|
-
setup = load_setup()
|
|
32
|
-
|
|
33
|
-
self.ogse_sim: SubProcess
|
|
34
|
-
self.device = OGSEInterface
|
|
35
|
-
|
|
36
|
-
self.fwc_calibration = setup.gse.ogse.calibration.fwc_calibration
|
|
37
|
-
|
|
38
|
-
if Settings.simulation_mode():
|
|
39
|
-
# In simulation mode, we start the simulator process and have the control server
|
|
40
|
-
# connect to that process instead of the hardware.
|
|
41
|
-
self.ogse_sim = SubProcess("OGSE Simulator",
|
|
42
|
-
[sys.executable, "-m", "egse.collimator.fcul.ogse_sim", "start"])
|
|
43
|
-
self.ogse_sim.execute(detach_from_parent=True)
|
|
44
|
-
time.sleep(2.0) # Allow the simulator time to start up
|
|
45
|
-
self.device = OGSEController(hostname="localhost")
|
|
46
|
-
else:
|
|
47
|
-
self.ogse_sim = None
|
|
48
|
-
self.device = OGSEController()
|
|
49
|
-
|
|
50
|
-
self.device.add_observer(self)
|
|
51
|
-
|
|
52
|
-
try:
|
|
53
|
-
self.device.connect()
|
|
54
|
-
except DeviceConnectionError as exc:
|
|
55
|
-
MODULE_LOGGER.warning(
|
|
56
|
-
"Couldn't establish a connection to the OGSE, check the log messages.")
|
|
57
|
-
MODULE_LOGGER.debug(f"{exc = }")
|
|
58
|
-
except ValueError as exc:
|
|
59
|
-
MODULE_LOGGER.warning(exc)
|
|
60
|
-
except DeviceTimeoutError as exc:
|
|
61
|
-
MODULE_LOGGER.warning(exc)
|
|
62
|
-
|
|
63
|
-
self.synoptics = SynopticsManagerProxy()
|
|
64
|
-
self.metrics = define_metrics(origin="OGSE", dashboard="GOGSE_MON", use_site=True, setup=setup)
|
|
65
|
-
|
|
66
|
-
def quit(self):
|
|
67
|
-
if self.synoptics is not None:
|
|
68
|
-
MODULE_LOGGER.info("Disconnecting from Synoptics Manager...")
|
|
69
|
-
self.synoptics.disconnect_cs()
|
|
70
|
-
|
|
71
|
-
if self.ogse_sim is not None:
|
|
72
|
-
MODULE_LOGGER.info("Terminating the OGSE Simulator...")
|
|
73
|
-
self.ogse_sim.quit()
|
|
74
|
-
|
|
75
|
-
def get_device(self):
|
|
76
|
-
return self.device
|
|
77
|
-
|
|
78
|
-
def get_status(self):
|
|
79
|
-
return super().get_status()
|
|
80
|
-
|
|
81
|
-
def get_housekeeping(self) -> dict:
|
|
82
|
-
|
|
83
|
-
hk = {"timestamp": format_datetime()}
|
|
84
|
-
|
|
85
|
-
ogse_status = self.device.status()
|
|
86
|
-
|
|
87
|
-
if isinstance(ogse_status, Failure):
|
|
88
|
-
MODULE_LOGGER.info(
|
|
89
|
-
"Failure detected while requesting the status of the OGSE. "
|
|
90
|
-
"No housekeeping generated. Check the log file for more information on the cause."
|
|
91
|
-
)
|
|
92
|
-
MODULE_LOGGER.error(f"Failure: {ogse_status}", exc_info=False)
|
|
93
|
-
return hk
|
|
94
|
-
|
|
95
|
-
ogse_laser = self.device.get_laser()
|
|
96
|
-
|
|
97
|
-
hk[f"G{SITE.ID}_OGSE_LDLS_LAMP"] = ogse_status["lamp"] == "ON"
|
|
98
|
-
hk[f"G{SITE.ID}_OGSE_LDLS_LASER"] = ogse_laser == "laser: ON"
|
|
99
|
-
hk[f"G{SITE.ID}_OGSE_PM_CH1_PWR"] = ogse_status["power1"]
|
|
100
|
-
hk[f"G{SITE.ID}_OGSE_PM_CH2_PWR"] = ogse_status["power2"]
|
|
101
|
-
hk[f"G{SITE.ID}_OGSE_REL_INTENSITY"] = ogse_status["att_factor"]
|
|
102
|
-
hk[f"G{SITE.ID}_OGSE_FWC_FRACTION"] = ogse_status["att_factor"] / self.fwc_calibration
|
|
103
|
-
|
|
104
|
-
# Send the HK acquired so far to the Synoptics Manager
|
|
105
|
-
|
|
106
|
-
hk_for_synoptics = hk.copy()
|
|
107
|
-
|
|
108
|
-
# The GOGSE_SHUTTER_OPEN parameter is not in the CSL OGSE HK but is included in the synoptics
|
|
109
|
-
|
|
110
|
-
if "CSL" in SITE.ID:
|
|
111
|
-
hk_for_synoptics[f"G{SITE.ID}_OGSE_SHUTTER_OPEN"] = True
|
|
112
|
-
|
|
113
|
-
self.synoptics.store_th_synoptics(hk_for_synoptics)
|
|
114
|
-
|
|
115
|
-
hk[f"G{SITE.ID}_OGSE_LDLS_INTERLOCK"] = ogse_status["interlock"] == "ON"
|
|
116
|
-
hk[f"G{SITE.ID}_OGSE_LDLS_POWER"] = ogse_status["power"] == "ON"
|
|
117
|
-
hk[f"G{SITE.ID}_OGSE_LDLS_PSU"] = ogse_status["psu"] == "ON"
|
|
118
|
-
hk[f"G{SITE.ID}_OGSE_PM_CH1_TEMP"] = ogse_status["temp1"]
|
|
119
|
-
hk[f"G{SITE.ID}_OGSE_PM_CH2_TEMP"] = ogse_status["temp2"]
|
|
120
|
-
hk[f"G{SITE.ID}_OGSE_LDLS_LAMP_FAULT"] = self.device.get_lamp_fault() == "lamp-fault: NO-ERROR"
|
|
121
|
-
hk[f"G{SITE.ID}_OGSE_LDLS_CTRL_FAULT"] = self.device.get_controller_fault() == "controller-fault: NO-ERROR"
|
|
122
|
-
hk[f"G{SITE.ID}_OGSE_LDLS_OPERATE"] = self.device.get_operate() == "operate: ON"
|
|
123
|
-
hk[f"G{SITE.ID}_OGSE_FW_MOVING"] = ogse_status["att_moving"]
|
|
124
|
-
|
|
125
|
-
pm_status = self.device.pm_status()
|
|
126
|
-
|
|
127
|
-
hk[f"G{SITE.ID}_OGSE_PM_CH1_STATUS"] = pm_status["pm1"] == "OK"
|
|
128
|
-
hk[f"G{SITE.ID}_OGSE_PM_CH2_STATUS"] = pm_status["pm2"] == "OK"
|
|
129
|
-
|
|
130
|
-
update_metrics(self.metrics, {name: hk[name] for name in hk if name in self.metrics})
|
|
131
|
-
|
|
132
|
-
return hk
|