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/listener.py
DELETED
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module defines Listeners between control servers and is part of a notification system where changes in
|
|
3
|
-
one control-server are notified to all listeners of that control-server.
|
|
4
|
-
|
|
5
|
-
Since we have communication between control servers, a listener registers to a control server with its name/id
|
|
6
|
-
and a Proxy class that will be used to send the notification. A listener can also contain an `event_id` to restrict
|
|
7
|
-
events to handle. (Shall events be filtered on the server (only notify events that match the `event_id` or shall they
|
|
8
|
-
be filtered on the client (only handle those events that match the `event_id` ?)
|
|
9
|
-
|
|
10
|
-
Any control server will support notification and listeners are added through the service proxy of the control server.
|
|
11
|
-
|
|
12
|
-
A control server that wants to be notified by an event needs to implement the EventInterface in the Proxy and in the
|
|
13
|
-
Controller.
|
|
14
|
-
|
|
15
|
-
"""
|
|
16
|
-
import logging
|
|
17
|
-
from enum import IntEnum
|
|
18
|
-
from typing import Any
|
|
19
|
-
from typing import Dict
|
|
20
|
-
from typing import List
|
|
21
|
-
from typing import Type
|
|
22
|
-
|
|
23
|
-
from egse.decorators import dynamic_interface
|
|
24
|
-
from egse.system import Timer
|
|
25
|
-
|
|
26
|
-
LOGGER = logging.getLogger(__name__)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class EVENT_ID(IntEnum):
|
|
30
|
-
ALL = 0
|
|
31
|
-
SETUP = 1
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class Event:
|
|
35
|
-
def __init__(self, event_id: int, context: Any):
|
|
36
|
-
self.id = event_id
|
|
37
|
-
self.context = context
|
|
38
|
-
|
|
39
|
-
def __repr__(self):
|
|
40
|
-
return f"Event({EVENT_ID(self.id).name}, {self.context})"
|
|
41
|
-
|
|
42
|
-
@property
|
|
43
|
-
def type(self) -> str:
|
|
44
|
-
try:
|
|
45
|
-
return self.context['event_type']
|
|
46
|
-
except KeyError:
|
|
47
|
-
return "unknown: event_type not provided"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
class EventInterface:
|
|
51
|
-
"""
|
|
52
|
-
A dynamic interface for handling events.
|
|
53
|
-
|
|
54
|
-
This interface defines a single method, 'handle_event', which is intended
|
|
55
|
-
to be implemented by classes that want to handle specific types of events.
|
|
56
|
-
|
|
57
|
-
Use this interface as a mixin for classes (Proxy/Controller) that implement this `handle_event` method.
|
|
58
|
-
|
|
59
|
-
"""
|
|
60
|
-
@dynamic_interface
|
|
61
|
-
def handle_event(self, event: Event):
|
|
62
|
-
"""Handles the specified event.
|
|
63
|
-
|
|
64
|
-
Args:
|
|
65
|
-
event (Event): An instance of the Event class representing the event to be handled.
|
|
66
|
-
"""
|
|
67
|
-
...
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
class Listeners:
|
|
71
|
-
"""
|
|
72
|
-
A class for managing and notifying registered listeners.
|
|
73
|
-
|
|
74
|
-
This class provides methods to add, remove, and notify listeners of events.
|
|
75
|
-
"""
|
|
76
|
-
|
|
77
|
-
def __init__(self):
|
|
78
|
-
"""Initializes an instance of the Listeners class."""
|
|
79
|
-
self._listeners: Dict[str, dict] = {}
|
|
80
|
-
|
|
81
|
-
def __len__(self):
|
|
82
|
-
"""Returns the number of registered listeners."""
|
|
83
|
-
return len(self._listeners)
|
|
84
|
-
|
|
85
|
-
def add_listener(self, listener: dict):
|
|
86
|
-
"""
|
|
87
|
-
Adds a new listener to the registered listeners.
|
|
88
|
-
|
|
89
|
-
The listener argument dictionary is expected to have at least the following key:values pairs:
|
|
90
|
-
|
|
91
|
-
* 'name': the name or identifier of the listener
|
|
92
|
-
* 'proxy': a Proxy object that will be used for notifying the service
|
|
93
|
-
|
|
94
|
-
Args:
|
|
95
|
-
listener (dict): A dictionary with properties of the listener,
|
|
96
|
-
including 'name' and 'proxy'.
|
|
97
|
-
|
|
98
|
-
Raises:
|
|
99
|
-
ValueError: If the listener already exists.
|
|
100
|
-
"""
|
|
101
|
-
try:
|
|
102
|
-
listener_name = listener["name"]
|
|
103
|
-
except KeyError as exc:
|
|
104
|
-
raise ValueError(f"Expected 'name' key in listener argument {listener}.") from exc
|
|
105
|
-
|
|
106
|
-
if listener_name in self._listeners:
|
|
107
|
-
raise ValueError(f"Process {listener_name} is already registered as a listener.")
|
|
108
|
-
|
|
109
|
-
# For now we make these listeners have a Proxy class that will be used for notification. Later on
|
|
110
|
-
# we might have other mechanisms for notification.
|
|
111
|
-
|
|
112
|
-
from egse.proxy import Proxy
|
|
113
|
-
|
|
114
|
-
proxy = listener.get('proxy')
|
|
115
|
-
if proxy is not None:
|
|
116
|
-
if not isinstance(proxy, type) or not issubclass(proxy, Proxy):
|
|
117
|
-
raise ValueError(f"Expected 'proxy' in listener argument {proxy=} to be a Proxy sub-class.")
|
|
118
|
-
|
|
119
|
-
self._listeners[listener_name] = listener
|
|
120
|
-
|
|
121
|
-
def remove_listener(self, listener: dict):
|
|
122
|
-
"""
|
|
123
|
-
Removes a listener from the registered listeners.
|
|
124
|
-
|
|
125
|
-
Args:
|
|
126
|
-
listener (dict): A dictionary representing the listener to be
|
|
127
|
-
removed. It should contain a 'name' key.
|
|
128
|
-
|
|
129
|
-
Raises:
|
|
130
|
-
ValueError: If the 'name' key is not present in the listener
|
|
131
|
-
argument or if the specified listener is not registered.
|
|
132
|
-
"""
|
|
133
|
-
|
|
134
|
-
try:
|
|
135
|
-
listener_name = listener["name"]
|
|
136
|
-
except KeyError as exc:
|
|
137
|
-
raise ValueError(f"Expected 'name' key in listener argument {listener}.") from exc
|
|
138
|
-
|
|
139
|
-
try:
|
|
140
|
-
del self._listeners[listener_name]
|
|
141
|
-
except KeyError as exc:
|
|
142
|
-
raise ValueError(f"Process {listener_name} cannot be removed, not registered.") from exc
|
|
143
|
-
|
|
144
|
-
def notify_listeners(self, event: Event):
|
|
145
|
-
"""
|
|
146
|
-
Notifies all registered listeners of a specific event.
|
|
147
|
-
|
|
148
|
-
Args:
|
|
149
|
-
event (Event): An instance of the Event class representing the
|
|
150
|
-
event to be broadcasted.
|
|
151
|
-
|
|
152
|
-
Note:
|
|
153
|
-
The 'handle_event' method is called on each listener's proxy
|
|
154
|
-
object to process the event.
|
|
155
|
-
"""
|
|
156
|
-
|
|
157
|
-
LOGGER.debug(f"Notifying listeners {self.get_listener_names()}")
|
|
158
|
-
|
|
159
|
-
for name, listener in self._listeners.items():
|
|
160
|
-
self.notify_listener(name, listener, event)
|
|
161
|
-
|
|
162
|
-
def notify_listener(self, name: str, listener: dict, event: Event):
|
|
163
|
-
"""
|
|
164
|
-
Notifies a registered listener fro the given event.
|
|
165
|
-
"""
|
|
166
|
-
proxy: Type[EventInterface] = listener['proxy']
|
|
167
|
-
|
|
168
|
-
# The Proxy uses a REQ-REP protocol and waits for an answer. That's why we have a Timer
|
|
169
|
-
# in the context so we are able to monitor how long it takes to notify a listener.
|
|
170
|
-
# The Timer can be removed when we are confident all `handle_event` functions are properly
|
|
171
|
-
# implemented.
|
|
172
|
-
with Timer(f"Notify listener {name}", log_level=logging.DEBUG), proxy() as pobj:
|
|
173
|
-
rc = pobj.handle_event(event)
|
|
174
|
-
|
|
175
|
-
LOGGER.debug(f"Listener {name} returned {rc=}")
|
|
176
|
-
|
|
177
|
-
def get_listener_names(self) -> List[str]:
|
|
178
|
-
"""Returns a list with the names of the registered listeners."""
|
|
179
|
-
return list(self._listeners.keys())
|
egse/logger/__init__.py
DELETED
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module defines the level, format and handlers for the root logger and for the special
|
|
3
|
-
'egse' logger. The egse_logger will be configured with a special handler which sends all
|
|
4
|
-
logging messages to a log control server.
|
|
5
|
-
|
|
6
|
-
This module is loaded whenever an egse module is loaded, to ensure all log messages are properly
|
|
7
|
-
forwarded to the log control server.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
import logging
|
|
11
|
-
import pickle
|
|
12
|
-
import sys
|
|
13
|
-
import traceback
|
|
14
|
-
|
|
15
|
-
import zmq
|
|
16
|
-
|
|
17
|
-
LOG_FORMAT_FULL = (
|
|
18
|
-
"%(asctime)23s:%(processName)20s:%(levelname)8s:%(lineno)5d:%(name)-20s:%(message)s"
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
# Configure the root logger
|
|
22
|
-
|
|
23
|
-
logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT_FULL)
|
|
24
|
-
|
|
25
|
-
__all__ = [
|
|
26
|
-
"egse_logger",
|
|
27
|
-
"set_all_logger_levels",
|
|
28
|
-
"ZeroMQHandler",
|
|
29
|
-
"close_all_zmq_handlers",
|
|
30
|
-
]
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class ZeroMQHandler(logging.Handler):
|
|
34
|
-
def __init__(self, uri=None, socket_type=zmq.PUSH, ctx=None):
|
|
35
|
-
|
|
36
|
-
from egse.settings import Settings
|
|
37
|
-
from egse.zmq_ser import connect_address
|
|
38
|
-
|
|
39
|
-
ctrl_settings = Settings.load("Logging Control Server")
|
|
40
|
-
uri = uri or connect_address(ctrl_settings.PROTOCOL, ctrl_settings.HOSTNAME,
|
|
41
|
-
ctrl_settings.LOGGING_PORT)
|
|
42
|
-
|
|
43
|
-
logging.Handler.__init__(self)
|
|
44
|
-
|
|
45
|
-
# print(f"ZeroMQHandler.__init__({uri=}, {socket_type=}, {ctx=})")
|
|
46
|
-
|
|
47
|
-
self.setLevel(logging.NOTSET)
|
|
48
|
-
|
|
49
|
-
self.ctx = ctx or zmq.Context().instance()
|
|
50
|
-
self.socket = zmq.Socket(self.ctx, socket_type)
|
|
51
|
-
self.socket.setsockopt(zmq.SNDHWM, 0) # never block on sending msg
|
|
52
|
-
self.socket.connect(uri)
|
|
53
|
-
|
|
54
|
-
def __del__(self):
|
|
55
|
-
self.close()
|
|
56
|
-
|
|
57
|
-
def close(self):
|
|
58
|
-
self.socket.close(linger=0)
|
|
59
|
-
|
|
60
|
-
def emit(self, record):
|
|
61
|
-
"""
|
|
62
|
-
Emit a record.
|
|
63
|
-
|
|
64
|
-
Writes the LogRecord to the queue, preparing it for pickling first.
|
|
65
|
-
"""
|
|
66
|
-
|
|
67
|
-
# print(f"ZeroMQHandler.emit({record})")
|
|
68
|
-
|
|
69
|
-
from egse.system import is_in_ipython
|
|
70
|
-
|
|
71
|
-
try:
|
|
72
|
-
if record.exc_info:
|
|
73
|
-
record.exc_text = traceback.format_exc()
|
|
74
|
-
record.exc_info = None # traceback objects can not be pickled
|
|
75
|
-
if record.processName == "MainProcess" and is_in_ipython():
|
|
76
|
-
record.processName = "IPython"
|
|
77
|
-
data = pickle.dumps(record.__dict__)
|
|
78
|
-
self.socket.send(data, flags=zmq.NOBLOCK)
|
|
79
|
-
except (KeyboardInterrupt, SystemExit):
|
|
80
|
-
raise
|
|
81
|
-
except Exception as exc:
|
|
82
|
-
print(f"ZeroMQHandler: Exception - {exc}", file=sys.stderr)
|
|
83
|
-
self.handleError(record)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def close_all_zmq_handlers():
|
|
87
|
-
"""
|
|
88
|
-
Close all the ZeroMQHandlers that are connected to a logger.
|
|
89
|
-
|
|
90
|
-
This function is automatically called upon termination of the control servers. For your own
|
|
91
|
-
applications, call this function before exiting the App.
|
|
92
|
-
"""
|
|
93
|
-
|
|
94
|
-
loggers = logging.Logger.manager.loggerDict
|
|
95
|
-
|
|
96
|
-
for name, logger in loggers.items():
|
|
97
|
-
if isinstance(logger, logging.PlaceHolder):
|
|
98
|
-
continue
|
|
99
|
-
for handler in logger.handlers:
|
|
100
|
-
if isinstance(handler, ZeroMQHandler):
|
|
101
|
-
logger.debug(f"Closing handler for logger {name}")
|
|
102
|
-
handler.close()
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
# Initialize logging as we want it for the Common-EGSE
|
|
106
|
-
#
|
|
107
|
-
# * The ZeroMQHandler to send all logging messages, i.e. level=DEBUG to the Logging Server
|
|
108
|
-
# * The (local) StreamingHandlers to print only INFO messages and higher
|
|
109
|
-
|
|
110
|
-
logging.disable(logging.NOTSET)
|
|
111
|
-
root_logger = logging.getLogger()
|
|
112
|
-
|
|
113
|
-
for handler in root_logger.handlers:
|
|
114
|
-
handler.setLevel(logging.INFO)
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
# Define the `egse` logger and add the ZeroMQHandler to this logger
|
|
118
|
-
|
|
119
|
-
egse_logger = logging.getLogger("egse")
|
|
120
|
-
egse_logger.setLevel(logging.DEBUG)
|
|
121
|
-
|
|
122
|
-
zmq_handler = ZeroMQHandler()
|
|
123
|
-
zmq_handler.setLevel(logging.NOTSET)
|
|
124
|
-
|
|
125
|
-
egse_logger.addHandler(zmq_handler)
|
|
126
|
-
egse_logger.setLevel(logging.DEBUG)
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
def replace_zmq_handler():
|
|
130
|
-
"""
|
|
131
|
-
This function will replace the current ZeroMQ Handler with a new instance. Use this function
|
|
132
|
-
in the run() method of a multiprocessing.Process:
|
|
133
|
-
|
|
134
|
-
import egse.logger
|
|
135
|
-
egse.logger.replace_zmq_handler()
|
|
136
|
-
|
|
137
|
-
Don't use this function in the __init__() method as only the run() method will execute in
|
|
138
|
-
the new Process and replace the handler in the proper environment. The reason for this is
|
|
139
|
-
that the ZeroMQ socket is not thread/Process safe, so a new ZeroMQ socket needs to be created
|
|
140
|
-
in the correct process environment.
|
|
141
|
-
"""
|
|
142
|
-
global egse_logger
|
|
143
|
-
|
|
144
|
-
this_handler = None
|
|
145
|
-
for handler in egse_logger.handlers:
|
|
146
|
-
if isinstance(handler, ZeroMQHandler):
|
|
147
|
-
this_handler = handler
|
|
148
|
-
if this_handler is not None:
|
|
149
|
-
egse_logger.removeHandler(this_handler)
|
|
150
|
-
egse_logger.addHandler(ZeroMQHandler())
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
def create_new_zmq_logger(name: str):
|
|
154
|
-
"""
|
|
155
|
-
Create a new logger with the given name and add a ZeroMQ Handler to this logger.
|
|
156
|
-
|
|
157
|
-
If the logger already has a ZeroMQ handler attached, don't add a second ZeroMQ handler,
|
|
158
|
-
just return the Logger object.
|
|
159
|
-
|
|
160
|
-
Args:
|
|
161
|
-
name: the requested name for the logger
|
|
162
|
-
|
|
163
|
-
Returns:
|
|
164
|
-
A Logger for the given name with a ZeroMQ handler attached.
|
|
165
|
-
"""
|
|
166
|
-
logger = logging.getLogger(name)
|
|
167
|
-
logger.setLevel(logging.DEBUG)
|
|
168
|
-
|
|
169
|
-
# If the ZeroMQ handler already exists for this logger, don't add a second handler
|
|
170
|
-
|
|
171
|
-
for handler in logger.handlers:
|
|
172
|
-
if isinstance(handler, ZeroMQHandler):
|
|
173
|
-
return logger
|
|
174
|
-
|
|
175
|
-
zmq_handler = ZeroMQHandler()
|
|
176
|
-
zmq_handler.setLevel(logging.NOTSET)
|
|
177
|
-
|
|
178
|
-
logger.addHandler(zmq_handler)
|
|
179
|
-
logger.setLevel(logging.DEBUG)
|
|
180
|
-
|
|
181
|
-
return logger
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
# We define a new level that is lower the DEBUG for extreme verbose messages
|
|
185
|
-
|
|
186
|
-
logging.FLASH_FLOOD = 5
|
|
187
|
-
logging.addLevelName(logging.FLASH_FLOOD, "FLASH_FLOOD")
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
def flash_flood(self, msg, *args, **kwargs):
|
|
191
|
-
if self.isEnabledFor(logging.FLASH_FLOOD):
|
|
192
|
-
self._log(logging.FLASH_FLOOD, msg, args, **kwargs)
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
logging.flash_flood = flash_flood
|
|
196
|
-
logging.Logger.flash_flood = flash_flood
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
def set_all_logger_levels(level: int):
|
|
200
|
-
global root_logger, egse_logger
|
|
201
|
-
|
|
202
|
-
root_logger.level = level
|
|
203
|
-
egse_logger.level = level
|
|
204
|
-
|
|
205
|
-
for handler in root_logger.handlers:
|
|
206
|
-
handler.setLevel(level)
|
|
207
|
-
|
|
208
|
-
# We don't want to restrict egse_logger levels
|
|
209
|
-
|
|
210
|
-
# for handler in egse_logger.handlers:
|
|
211
|
-
# handler.setLevel(level)
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
if __name__ == "__main__":
|
|
215
|
-
|
|
216
|
-
import egse.logger
|
|
217
|
-
|
|
218
|
-
LOGGER = logging.getLogger("egse.0mq-log-test")
|
|
219
|
-
LOGGER.setLevel(logging.FLASH_FLOOD)
|
|
220
|
-
|
|
221
|
-
LOGGER.flash_flood("Hello, ZeroMQ logging: This is a FLASH_FLOOD message.")
|
|
222
|
-
LOGGER.debug("Hello, ZeroMQ logging: This is a DEBUG message.")
|
|
223
|
-
LOGGER.info("Hello, ZeroMQ logging: This is an INFO message.")
|
|
224
|
-
LOGGER.warning("Hello, ZeroMQ logging: This is a WARNING message.")
|
|
225
|
-
LOGGER.error("Hello, ZeroMQ logging: This is an ERROR message.")
|
|
226
|
-
LOGGER.critical("Hello, ZeroMQ logging: This is a CRITICAL message.")
|
|
227
|
-
try:
|
|
228
|
-
raise ValueError("A fake ValueError, raised for testing.")
|
|
229
|
-
except ValueError:
|
|
230
|
-
LOGGER.exception("Hello, ZeroMQ logging: This is an EXCEPTION message.")
|
|
231
|
-
|
|
232
|
-
LOGGER = logging.getLogger("plain-log-test")
|
|
233
|
-
|
|
234
|
-
LOGGER.flash_flood("Vanilla logging: This is a FLASH_FLOOD message.")
|
|
235
|
-
LOGGER.debug("Vanilla logging: This is a DEBUG message.")
|
|
236
|
-
LOGGER.info("Vanilla logging: This is an INFO message.")
|
|
237
|
-
LOGGER.warning("Vanilla logging: This is a WARNING message.")
|
|
238
|
-
LOGGER.error("Vanilla logging: This is an ERROR message.")
|
|
239
|
-
LOGGER.critical("Vanilla logging: This is a CRITICAL message.")
|
|
240
|
-
try:
|
|
241
|
-
raise ValueError("A fake ValueError, raised for testing.")
|
|
242
|
-
except ValueError:
|
|
243
|
-
LOGGER.exception("Vanilla logging: This is an EXCEPTION message.")
|