cgse 2023.38.0__py3-none-any.whl → 2024.1.3__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 +77 -0
- cgse-2024.1.3.dist-info/METADATA +41 -0
- cgse-2024.1.3.dist-info/RECORD +5 -0
- {cgse-2023.38.0.dist-info → cgse-2024.1.3.dist-info}/WHEEL +1 -2
- cgse-2023.38.0.dist-info/COPYING +0 -674
- cgse-2023.38.0.dist-info/COPYING.LESSER +0 -165
- cgse-2023.38.0.dist-info/METADATA +0 -144
- cgse-2023.38.0.dist-info/RECORD +0 -649
- cgse-2023.38.0.dist-info/entry_points.txt +0 -75
- cgse-2023.38.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5235
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -626
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -912
- egse/aeu/aeu_metrics.py +0 -131
- egse/aeu/aeu_protocol.py +0 -463
- egse/aeu/aeu_psu.yaml +0 -204
- egse/aeu/aeu_ui.py +0 -873
- egse/aeu/arbdata/FccdRead.arb +0 -2
- egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
- egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/ccdRead25.arb +0 -2
- egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead50.arb +0 -2
- egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
- egse/alert/__init__.py +0 -1049
- egse/alert/alertman.yaml +0 -37
- egse/alert/alertman_cs.py +0 -234
- egse/alert/alertman_ui.py +0 -603
- egse/alert/gsm/beaglebone.py +0 -138
- egse/alert/gsm/beaglebone.yaml +0 -51
- egse/alert/gsm/beaglebone_cs.py +0 -108
- egse/alert/gsm/beaglebone_devif.py +0 -130
- egse/alert/gsm/beaglebone_protocol.py +0 -48
- egse/bits.py +0 -318
- egse/camera.py +0 -44
- egse/collimator/__init__.py +0 -0
- egse/collimator/fcul/__init__.py +0 -0
- egse/collimator/fcul/ogse.py +0 -1077
- egse/collimator/fcul/ogse.yaml +0 -14
- egse/collimator/fcul/ogse_cs.py +0 -154
- egse/collimator/fcul/ogse_devif.py +0 -358
- egse/collimator/fcul/ogse_protocol.py +0 -129
- egse/collimator/fcul/ogse_sim.py +0 -431
- egse/collimator/fcul/ogse_ui.py +0 -1108
- egse/command.py +0 -699
- egse/config.py +0 -410
- egse/confman/__init__.py +0 -1015
- egse/confman/confman.yaml +0 -67
- egse/confman/confman_cs.py +0 -239
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -442
- egse/coordinates/__init__.py +0 -531
- egse/coordinates/avoidance.py +0 -103
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -120
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -195
- egse/coordinates/referenceFrame.py +0 -1279
- egse/coordinates/refmodel.py +0 -737
- egse/coordinates/rotationMatrix.py +0 -85
- egse/coordinates/transform3d_addon.py +0 -419
- egse/csl/__init__.py +0 -50
- egse/csl/commanding.py +0 -78
- egse/csl/icons/hexapod-connected-selected.svg +0 -30
- egse/csl/icons/hexapod-connected.svg +0 -30
- egse/csl/icons/hexapod-homing-selected.svg +0 -68
- egse/csl/icons/hexapod-homing.svg +0 -68
- egse/csl/icons/hexapod-retract-selected.svg +0 -56
- egse/csl/icons/hexapod-retract.svg +0 -51
- egse/csl/icons/hexapod-zero-selected.svg +0 -56
- egse/csl/icons/hexapod-zero.svg +0 -56
- egse/csl/icons/logo-puna.svg +0 -92
- egse/csl/icons/stop.svg +0 -1
- egse/csl/initialisation.py +0 -102
- egse/csl/mech_pos_settings.yaml +0 -18
- egse/das.py +0 -1247
- egse/das.yaml +0 -7
- egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
- egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
- egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
- egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
- egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
- egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
- egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
- egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
- egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
- egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
- egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
- egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
- egse/decorators.py +0 -415
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2681
- egse/dpu/ccd_ui.py +0 -508
- egse/dpu/dpu.py +0 -786
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -668
- egse/dpu/fitsgen.py +0 -2077
- egse/dpu/fitsgen_test.py +0 -752
- egse/dpu/fitsgen_ui.py +0 -399
- egse/dpu/hdf5_model.py +0 -332
- egse/dpu/hdf5_ui.py +0 -277
- egse/dpu/hdf5_viewer.py +0 -506
- egse/dpu/hk_ui.py +0 -468
- egse/dpu_commands.py +0 -81
- egse/dsi/constants.py +0 -220
- egse/dsi/esl.py +0 -870
- egse/dsi/rmap.py +0 -1042
- egse/dsi/rmapci.py +0 -37
- egse/dsi/spw.py +0 -154
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -258
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -28
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -51
- egse/fdir/fdir_manager_controller.py +0 -228
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -25
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -37
- egse/fdir/fdir_remote_controller.py +0 -50
- egse/fdir/fdir_remote_cs.py +0 -97
- egse/fdir/fdir_remote_interface.py +0 -14
- egse/fdir/fdir_remote_popup.py +0 -31
- egse/fee/__init__.py +0 -114
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/fee.py +0 -631
- egse/fee/feesim.py +0 -750
- egse/fee/n_fee_hk.py +0 -761
- egse/fee/nfee.py +0 -187
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -24
- egse/filterwheel/eksma/fw8smc4.py +0 -661
- egse/filterwheel/eksma/fw8smc4.yaml +0 -121
- egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
- egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
- egse/filterwheel/eksma/fw8smc4_protocol.py +0 -81
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -111
- egse/filterwheel/eksma/fw8smc5.yaml +0 -105
- egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
- egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
- egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
- egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
- egse/filterwheel/eksma/fw8smc5_ui.py +0 -1068
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -712
- egse/fov/fov_ui.py +0 -861
- egse/fov/fov_ui_controller.py +0 -140
- egse/fov/fov_ui_model.py +0 -200
- egse/fov/fov_ui_view.py +0 -345
- egse/gimbal/__init__.py +0 -32
- egse/gimbal/symetrie/__init__.py +0 -26
- egse/gimbal/symetrie/alpha.py +0 -586
- egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
- egse/gimbal/symetrie/gimbal.py +0 -877
- egse/gimbal/symetrie/gimbal.yaml +0 -168
- egse/gimbal/symetrie/gimbal_cs.py +0 -183
- egse/gimbal/symetrie/gimbal_protocol.py +0 -135
- egse/gimbal/symetrie/gimbal_ui.py +0 -361
- egse/gimbal/symetrie/pmac.py +0 -1006
- egse/gimbal/symetrie/pmac_regex.py +0 -83
- egse/graph.py +0 -132
- egse/gui/__init__.py +0 -47
- egse/gui/buttons.py +0 -378
- egse/gui/focalplane.py +0 -1281
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -588
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- egse/gui/switch.py +0 -112
- egse/h5.py +0 -274
- egse/help/__init__.py +0 -0
- egse/help/help_ui.py +0 -126
- egse/hexapod/__init__.py +0 -32
- egse/hexapod/symetrie/__init__.py +0 -138
- egse/hexapod/symetrie/alpha.py +0 -874
- egse/hexapod/symetrie/dynalpha.py +0 -1387
- egse/hexapod/symetrie/hexapod_ui.py +0 -1516
- egse/hexapod/symetrie/pmac.py +0 -1010
- egse/hexapod/symetrie/pmac_regex.py +0 -83
- egse/hexapod/symetrie/puna.py +0 -1167
- egse/hexapod/symetrie/puna.yaml +0 -193
- egse/hexapod/symetrie/puna_cs.py +0 -196
- egse/hexapod/symetrie/puna_protocol.py +0 -131
- egse/hexapod/symetrie/puna_ui.py +0 -434
- egse/hexapod/symetrie/punaplus.py +0 -107
- egse/hexapod/symetrie/zonda.py +0 -872
- egse/hexapod/symetrie/zonda.yaml +0 -337
- egse/hexapod/symetrie/zonda_cs.py +0 -172
- egse/hexapod/symetrie/zonda_devif.py +0 -415
- egse/hexapod/symetrie/zonda_protocol.py +0 -119
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -765
- egse/icons/aeu-cs-start.svg +0 -117
- egse/icons/aeu-cs-stop.svg +0 -118
- egse/icons/aeu-cs.svg +0 -107
- egse/icons/aeu_cs-started.svg +0 -112
- egse/icons/aeu_cs-stopped.svg +0 -112
- egse/icons/aeu_cs.svg +0 -55
- egse/icons/alert.svg +0 -1
- egse/icons/arrow-double-left.png +0 -0
- egse/icons/arrow-double-right.png +0 -0
- egse/icons/arrow-up.svg +0 -11
- egse/icons/backward.svg +0 -1
- egse/icons/busy.svg +0 -1
- egse/icons/cleaning.svg +0 -115
- egse/icons/color-scheme.svg +0 -1
- egse/icons/cs-connected-alert.svg +0 -91
- egse/icons/cs-connected-disabled.svg +0 -43
- egse/icons/cs-connected.svg +0 -89
- egse/icons/cs-not-connected.svg +0 -44
- egse/icons/double-left-arrow.svg +0 -1
- egse/icons/double-right-arrow.svg +0 -1
- egse/icons/erase-disabled.svg +0 -19
- egse/icons/erase.svg +0 -59
- egse/icons/fitsgen-start.svg +0 -47
- egse/icons/fitsgen-stop.svg +0 -48
- egse/icons/fitsgen.svg +0 -1
- egse/icons/forward.svg +0 -1
- egse/icons/fov-hk-start.svg +0 -33
- egse/icons/fov-hk-stop.svg +0 -37
- egse/icons/fov-hk.svg +0 -1
- egse/icons/front-desk.svg +0 -1
- egse/icons/home-actioned.svg +0 -15
- egse/icons/home-disabled.svg +0 -15
- egse/icons/home.svg +0 -13
- egse/icons/info.svg +0 -1
- egse/icons/invalid.png +0 -0
- egse/icons/led-green.svg +0 -20
- egse/icons/led-grey.svg +0 -20
- egse/icons/led-orange.svg +0 -20
- egse/icons/led-red.svg +0 -20
- egse/icons/led-square-green.svg +0 -134
- egse/icons/led-square-grey.svg +0 -134
- egse/icons/led-square-orange.svg +0 -134
- egse/icons/led-square-red.svg +0 -134
- egse/icons/limit-switch-all-green.svg +0 -115
- egse/icons/limit-switch-all-red.svg +0 -117
- egse/icons/limit-switch-el+.svg +0 -116
- egse/icons/limit-switch-el-.svg +0 -117
- egse/icons/location-marker.svg +0 -1
- egse/icons/logo-dpu.svg +0 -48
- egse/icons/logo-gimbal.svg +0 -112
- egse/icons/logo-huber.svg +0 -23
- egse/icons/logo-ogse.svg +0 -31
- egse/icons/logo-puna.svg +0 -92
- egse/icons/logo-tcs.svg +0 -29
- egse/icons/logo-zonda.svg +0 -66
- egse/icons/maximize.svg +0 -1
- egse/icons/meter.svg +0 -1
- egse/icons/more.svg +0 -45
- egse/icons/n-fee-hk-start.svg +0 -24
- egse/icons/n-fee-hk-stop.svg +0 -25
- egse/icons/n-fee-hk.svg +0 -83
- egse/icons/observing-off.svg +0 -46
- egse/icons/observing-on.svg +0 -46
- egse/icons/open-document-hdf5.png +0 -0
- egse/icons/open-document-hdf5.svg +0 -21
- egse/icons/ops-mode.svg +0 -1
- egse/icons/play-green.svg +0 -17
- egse/icons/plugged-disabled.svg +0 -27
- egse/icons/plugged.svg +0 -21
- egse/icons/pm_ui.svg +0 -1
- egse/icons/power-button-green.svg +0 -27
- egse/icons/power-button-red.svg +0 -27
- egse/icons/power-button.svg +0 -27
- egse/icons/radar.svg +0 -1
- egse/icons/radioactive.svg +0 -2
- egse/icons/reload.svg +0 -1
- egse/icons/remote-control-off.svg +0 -28
- egse/icons/remote-control-on.svg +0 -28
- egse/icons/repeat-blue.svg +0 -15
- egse/icons/repeat.svg +0 -1
- egse/icons/settings.svg +0 -1
- egse/icons/shrink.svg +0 -1
- egse/icons/shutter.svg +0 -1
- egse/icons/sign-off.svg +0 -1
- egse/icons/sign-on.svg +0 -1
- egse/icons/sim-mode.svg +0 -1
- egse/icons/small-buttons-go.svg +0 -20
- egse/icons/small-buttons-minus.svg +0 -51
- egse/icons/small-buttons-plus.svg +0 -51
- egse/icons/sponge.svg +0 -220
- egse/icons/start-button-disabled.svg +0 -84
- egse/icons/start-button.svg +0 -50
- egse/icons/stop-button-disabled.svg +0 -84
- egse/icons/stop-button.svg +0 -50
- egse/icons/stop-red.svg +0 -17
- egse/icons/stop.svg +0 -1
- egse/icons/switch-disabled-square.svg +0 -87
- egse/icons/switch-disabled.svg +0 -15
- egse/icons/switch-off-square.svg +0 -87
- egse/icons/switch-off.svg +0 -72
- egse/icons/switch-on-square.svg +0 -87
- egse/icons/switch-on.svg +0 -61
- egse/icons/temperature-control.svg +0 -44
- egse/icons/th_ui_logo.svg +0 -1
- egse/icons/unplugged.svg +0 -23
- egse/icons/unvalid.png +0 -0
- egse/icons/user-interface.svg +0 -1
- egse/icons/vacuum.svg +0 -1
- egse/icons/valid.png +0 -0
- egse/icons/zoom-to-pixel-dark.svg +0 -64
- egse/icons/zoom-to-pixel-white.svg +0 -36
- egse/images/big-rotation-stage.png +0 -0
- egse/images/connected-100.png +0 -0
- egse/images/cross.svg +0 -6
- egse/images/disconnected-100.png +0 -0
- egse/images/gui-icon.png +0 -0
- egse/images/home.svg +0 -6
- egse/images/info-icon.png +0 -0
- egse/images/led-black.svg +0 -89
- egse/images/led-green.svg +0 -85
- egse/images/led-orange.svg +0 -85
- egse/images/led-red.svg +0 -85
- egse/images/load-icon.png +0 -0
- egse/images/load-setup.png +0 -0
- egse/images/load.png +0 -0
- egse/images/pause.png +0 -0
- egse/images/play-button.svg +0 -8
- egse/images/play.png +0 -0
- egse/images/process-status.png +0 -0
- egse/images/restart.png +0 -0
- egse/images/search.png +0 -0
- egse/images/sma.png +0 -0
- egse/images/start.png +0 -0
- egse/images/stop-button.svg +0 -8
- egse/images/stop.png +0 -0
- egse/images/switch-off.svg +0 -48
- egse/images/switch-on.svg +0 -48
- egse/images/undo.png +0 -0
- egse/images/update-button.svg +0 -11
- egse/imageviewer/exposureselection.py +0 -475
- egse/imageviewer/imageviewer.py +0 -198
- egse/imageviewer/matchfocalplane.py +0 -179
- egse/imageviewer/subfieldposition.py +0 -133
- egse/lampcontrol/__init__.py +0 -4
- egse/lampcontrol/beaglebone/beaglebone.py +0 -178
- egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
- egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
- egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
- egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
- egse/lampcontrol/energetiq/__init__.py +0 -22
- egse/lampcontrol/energetiq/eq99.yaml +0 -98
- egse/lampcontrol/energetiq/lampEQ99.py +0 -283
- egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
- egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
- egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
- egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -69
- egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
- egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
- egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
- egse/lib/macOS/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/macOS/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
- egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
- egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
- egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
- egse/lib/ximc/libximc.framework/libbindy.so +0 -0
- egse/lib/ximc/libximc.framework/libximc +0 -0
- egse/lib/ximc/libximc.framework/libximc.so +0 -0
- egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
- egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
- egse/lib/ximc/pyximc.py +0 -922
- egse/listener.py +0 -73
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -98
- egse/mixin.py +0 -464
- egse/monitoring.py +0 -95
- egse/ni/alarms/__init__.py +0 -26
- egse/ni/alarms/cdaq9375.py +0 -300
- egse/ni/alarms/cdaq9375.yaml +0 -89
- egse/ni/alarms/cdaq9375_cs.py +0 -130
- egse/ni/alarms/cdaq9375_devif.py +0 -183
- egse/ni/alarms/cdaq9375_protocol.py +0 -48
- egse/obs_inspection.py +0 -163
- egse/observer.py +0 -41
- egse/obsid.py +0 -163
- egse/powermeter/__init__.py +0 -0
- egse/powermeter/ni/__init__.py +0 -38
- egse/powermeter/ni/cdaq9184.py +0 -224
- egse/powermeter/ni/cdaq9184.yaml +0 -73
- egse/powermeter/ni/cdaq9184_cs.py +0 -130
- egse/powermeter/ni/cdaq9184_devif.py +0 -201
- egse/powermeter/ni/cdaq9184_protocol.py +0 -48
- egse/powermeter/ni/cdaq9184_ui.py +0 -544
- egse/powermeter/thorlabs/__init__.py +0 -25
- egse/powermeter/thorlabs/pm100a.py +0 -380
- egse/powermeter/thorlabs/pm100a.yaml +0 -132
- egse/powermeter/thorlabs/pm100a_cs.py +0 -136
- egse/powermeter/thorlabs/pm100a_devif.py +0 -127
- egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
- egse/powermeter/thorlabs/pm100a_ui.py +0 -725
- egse/process.py +0 -451
- egse/procman/__init__.py +0 -811
- egse/procman/cannot_start_process_popup.py +0 -43
- egse/procman/procman.yaml +0 -49
- egse/procman/procman_cs.py +0 -201
- egse/procman/procman_ui.py +0 -2081
- egse/protocol.py +0 -603
- egse/proxy.py +0 -522
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -675
- egse/resource.py +0 -333
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -212
- egse/services.yaml +0 -51
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1180
- egse/shutter/__init__.py +0 -0
- egse/shutter/thorlabs/__init__.py +0 -19
- egse/shutter/thorlabs/ksc101.py +0 -205
- egse/shutter/thorlabs/ksc101.yaml +0 -105
- egse/shutter/thorlabs/ksc101_cs.py +0 -136
- egse/shutter/thorlabs/ksc101_devif.py +0 -201
- egse/shutter/thorlabs/ksc101_protocol.py +0 -69
- egse/shutter/thorlabs/ksc101_ui.py +0 -548
- egse/shutter/thorlabs/sc10.py +0 -82
- egse/shutter/thorlabs/sc10.yaml +0 -52
- egse/shutter/thorlabs/sc10_controller.py +0 -81
- egse/shutter/thorlabs/sc10_cs.py +0 -108
- egse/shutter/thorlabs/sc10_interface.py +0 -25
- egse/shutter/thorlabs/sc10_simulator.py +0 -30
- egse/simulator.py +0 -41
- egse/slack.py +0 -61
- egse/socketdevice.py +0 -218
- egse/sockets.py +0 -218
- egse/spw.py +0 -1479
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -247
- egse/stages/aerotech/ensemble.yaml +0 -205
- egse/stages/aerotech/ensemble_controller.py +0 -275
- egse/stages/aerotech/ensemble_cs.py +0 -110
- egse/stages/aerotech/ensemble_interface.py +0 -132
- egse/stages/aerotech/ensemble_parameters.py +0 -433
- egse/stages/aerotech/ensemble_simulator.py +0 -27
- egse/stages/aerotech/mgse_sim.py +0 -193
- egse/stages/arun/smd3.py +0 -111
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -472
- egse/stages/arun/smd3_cs.py +0 -112
- egse/stages/arun/smd3_interface.py +0 -53
- egse/stages/arun/smd3_simulator.py +0 -27
- egse/stages/arun/smd3_stop.py +0 -16
- egse/stages/huber/__init__.py +0 -49
- egse/stages/huber/smc9300.py +0 -904
- egse/stages/huber/smc9300.yaml +0 -63
- egse/stages/huber/smc9300_cs.py +0 -178
- egse/stages/huber/smc9300_devif.py +0 -345
- egse/stages/huber/smc9300_protocol.py +0 -111
- egse/stages/huber/smc9300_sim.py +0 -547
- egse/stages/huber/smc9300_ui.py +0 -973
- egse/state.py +0 -173
- egse/statemachine.py +0 -274
- egse/storage/__init__.py +0 -1004
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -72
- egse/storage/storage_cs.py +0 -214
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -412
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1408
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -874
- egse/tcs/tcs.yaml +0 -14
- egse/tcs/tcs_cs.py +0 -202
- egse/tcs/tcs_devif.py +0 -292
- egse/tcs/tcs_protocol.py +0 -177
- egse/tcs/tcs_sim.py +0 -177
- egse/tcs/tcs_ui.py +0 -543
- egse/tdms.py +0 -171
- egse/tempcontrol/__init__.py +0 -23
- egse/tempcontrol/agilent/agilent34970.py +0 -109
- egse/tempcontrol/agilent/agilent34970.yaml +0 -44
- egse/tempcontrol/agilent/agilent34970_cs.py +0 -116
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -99
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -117
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -101
- egse/tempcontrol/beaglebone/beaglebone.py +0 -342
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -135
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -681
- egse/tempcontrol/digalox/digalox.py +0 -107
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -112
- egse/tempcontrol/digalox/digalox_protocol.py +0 -55
- egse/tempcontrol/keithley/__init__.py +0 -33
- egse/tempcontrol/keithley/daq6510.py +0 -662
- egse/tempcontrol/keithley/daq6510.yaml +0 -105
- egse/tempcontrol/keithley/daq6510_cs.py +0 -163
- egse/tempcontrol/keithley/daq6510_devif.py +0 -343
- egse/tempcontrol/keithley/daq6510_protocol.py +0 -78
- egse/tempcontrol/keithley/daq6510_sim.py +0 -186
- egse/tempcontrol/lakeshore/__init__.py +0 -33
- egse/tempcontrol/lakeshore/lsci.py +0 -361
- egse/tempcontrol/lakeshore/lsci.yaml +0 -162
- egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
- egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
- egse/tempcontrol/lakeshore/lsci_protocol.py +0 -73
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -389
- egse/tempcontrol/ni/__init__.py +0 -0
- egse/tempcontrol/spid/spid.py +0 -109
- egse/tempcontrol/spid/spid.yaml +0 -81
- egse/tempcontrol/spid/spid_controller.py +0 -279
- egse/tempcontrol/spid/spid_cs.py +0 -136
- egse/tempcontrol/spid/spid_protocol.py +0 -107
- egse/tempcontrol/spid/spid_ui.py +0 -727
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -875
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -118
- egse/tempcontrol/srs/ptc10_protocol.py +0 -42
- egse/tempcontrol/srs/ptc10_ui.py +0 -906
- egse/ups/apc/apc.py +0 -236
- egse/ups/apc/apc.yaml +0 -45
- egse/ups/apc/apc_cs.py +0 -101
- egse/ups/apc/apc_protocol.py +0 -125
- egse/user.yaml +0 -7
- egse/vacuum/beaglebone/beaglebone.py +0 -149
- egse/vacuum/beaglebone/beaglebone.yaml +0 -44
- egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
- egse/vacuum/beaglebone/beaglebone_devif.py +0 -164
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -193
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -92
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -128
- egse/vacuum/instrutech/igm402_cs.py +0 -108
- egse/vacuum/instrutech/igm402_interface.py +0 -49
- egse/vacuum/instrutech/igm402_simulator.py +0 -36
- egse/vacuum/keller/kellerBus.py +0 -256
- egse/vacuum/keller/leo3.py +0 -102
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -83
- egse/vacuum/keller/leo3_cs.py +0 -101
- egse/vacuum/keller/leo3_interface.py +0 -33
- egse/vacuum/mks/evision.py +0 -86
- egse/vacuum/mks/evision.yaml +0 -75
- egse/vacuum/mks/evision_cs.py +0 -101
- egse/vacuum/mks/evision_devif.py +0 -316
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -704
- egse/vacuum/pfeiffer/acp40.py +0 -87
- egse/vacuum/pfeiffer/acp40.yaml +0 -60
- egse/vacuum/pfeiffer/acp40_controller.py +0 -117
- egse/vacuum/pfeiffer/acp40_cs.py +0 -109
- egse/vacuum/pfeiffer/acp40_interface.py +0 -40
- egse/vacuum/pfeiffer/acp40_simulator.py +0 -39
- egse/vacuum/pfeiffer/tc400.py +0 -113
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -140
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -24
- egse/vacuum/pfeiffer/tpg261.py +0 -81
- egse/vacuum/pfeiffer/tpg261.yaml +0 -66
- egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
- egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
- egse/vacuum/pfeiffer/tpg261_interface.py +0 -60
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -24
- egse/version.py +0 -174
- egse/visitedpositions.py +0 -398
- egse/windowing.py +0 -213
- egse/zmq/__init__.py +0 -28
- egse/zmq/spw.py +0 -160
- egse/zmq_ser.py +0 -41
- scripts/alerts/cold.yaml +0 -278
- scripts/alerts/example_alerts.yaml +0 -54
- scripts/alerts/transition.yaml +0 -14
- scripts/alerts/warm.yaml +0 -49
- scripts/analyse_n_fee_hk_data.py +0 -44
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/create_hdf5_report.py +0 -295
- scripts/csl_model.py +0 -436
- scripts/csl_restore_setup.py +0 -230
- scripts/export-grafana-dashboards.py +0 -50
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -59
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -11
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -64
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -61
- scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
- scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
- scripts/fix_csv.py +0 -80
- scripts/n_fee_supply_voltage_calculation.py +0 -92
- scripts/playground.py +0 -30
- scripts/print_hdf5_hk_data.py +0 -68
- scripts/print_register_map.py +0 -43
- scripts/sron/commanding/control_heaters.py +0 -44
- scripts/sron/commanding/pumpdown.py +0 -46
- scripts/sron/commanding/set_pid_setpoint.py +0 -19
- scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
- scripts/sron/commanding/shutdown_pumps.py +0 -33
- scripts/sron/tm_gen/tm_gen_agilent.py +0 -38
- scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
- scripts/sron/tm_gen/tm_gen_spid.py +0 -13
- scripts/update_operational_cgse.py +0 -268
- scripts/update_operational_cgse_old.py +0 -273
egse/listener.py
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from enum import IntEnum
|
|
3
|
-
from typing import Any
|
|
4
|
-
|
|
5
|
-
from egse.decorators import dynamic_interface
|
|
6
|
-
|
|
7
|
-
LOGGER = logging.getLogger(__name__)
|
|
8
|
-
|
|
9
|
-
class EVENT_ID(IntEnum):
|
|
10
|
-
ALL = 0
|
|
11
|
-
SETUP = 1
|
|
12
|
-
|
|
13
|
-
class Event:
|
|
14
|
-
def __init__(self, event_id: int, context: Any):
|
|
15
|
-
self.id = event_id
|
|
16
|
-
self.context = context
|
|
17
|
-
def __repr__(self):
|
|
18
|
-
return f"Event({self.id}, {self.context})"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class EventInterface:
|
|
22
|
-
@dynamic_interface
|
|
23
|
-
def handle_event(self, event: Event):
|
|
24
|
-
...
|
|
25
|
-
|
|
26
|
-
class Listeners:
|
|
27
|
-
def __init__(self):
|
|
28
|
-
self._listeners: dict[str, dict] = {}
|
|
29
|
-
|
|
30
|
-
def __len__(self):
|
|
31
|
-
return len(self._listeners)
|
|
32
|
-
|
|
33
|
-
def add_listener(self, listener: dict):
|
|
34
|
-
"""
|
|
35
|
-
The argument is a dictionary with the following expected content:
|
|
36
|
-
|
|
37
|
-
* name (str): the name of the process
|
|
38
|
-
* proxy (str): the proxy class
|
|
39
|
-
|
|
40
|
-
Args:
|
|
41
|
-
listener: a dictionary with properties of the listener
|
|
42
|
-
|
|
43
|
-
Raises:
|
|
44
|
-
ValueError if the listener already exists.
|
|
45
|
-
"""
|
|
46
|
-
try:
|
|
47
|
-
listener_name = listener["name"]
|
|
48
|
-
except KeyError as exc:
|
|
49
|
-
raise ValueError(f"Expected 'name' key in listener argument {listener}.") from exc
|
|
50
|
-
|
|
51
|
-
if listener_name in self._listeners:
|
|
52
|
-
raise ValueError(f"Process {listener_name} is already registered as a listener.")
|
|
53
|
-
|
|
54
|
-
self._listeners[listener_name] = listener
|
|
55
|
-
|
|
56
|
-
def remove_listener(self, listener: dict):
|
|
57
|
-
try:
|
|
58
|
-
listener_name = listener["name"]
|
|
59
|
-
except KeyError as exc:
|
|
60
|
-
raise ValueError(f"Expected 'name' key in listener argument {listener}.") from exc
|
|
61
|
-
|
|
62
|
-
try:
|
|
63
|
-
del self._listeners[listener_name]
|
|
64
|
-
except KeyError as exc:
|
|
65
|
-
raise ValueError(f"Process {listener_name} cannot be removed, not registered.") from exc
|
|
66
|
-
|
|
67
|
-
def notify_listeners(self, event: Event):
|
|
68
|
-
for name, listener in self._listeners.items():
|
|
69
|
-
proxy = listener['proxy']
|
|
70
|
-
LOGGER.info(f"Notifying process {name} of {event.context or {}} on {event.id=}")
|
|
71
|
-
with proxy() as pobj:
|
|
72
|
-
rc = pobj.handle_event(event)
|
|
73
|
-
LOGGER.info(f"{rc=}")
|
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.")
|
egse/logger/log_cs.py
DELETED
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
The Log Server receives all log messages and events from control servers and client applications
|
|
3
|
-
and saves those messages in a log file at a given location.
|
|
4
|
-
"""
|
|
5
|
-
import datetime
|
|
6
|
-
import logging
|
|
7
|
-
import multiprocessing
|
|
8
|
-
import pickle
|
|
9
|
-
from logging import StreamHandler
|
|
10
|
-
from logging.handlers import SocketHandler
|
|
11
|
-
from logging.handlers import TimedRotatingFileHandler
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from typing import Optional
|
|
14
|
-
from typing import Union
|
|
15
|
-
|
|
16
|
-
import click
|
|
17
|
-
import rich
|
|
18
|
-
import zmq
|
|
19
|
-
from prometheus_client import Counter
|
|
20
|
-
from prometheus_client import start_http_server
|
|
21
|
-
|
|
22
|
-
from egse.env import get_log_file_location
|
|
23
|
-
from egse.settings import Settings
|
|
24
|
-
from egse.system import format_datetime
|
|
25
|
-
from egse.system import replace_environment_variable
|
|
26
|
-
from egse.zmq_ser import bind_address
|
|
27
|
-
from egse.zmq_ser import connect_address
|
|
28
|
-
|
|
29
|
-
CTRL_SETTINGS = Settings.load("Logging Control Server")
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
# The format for the log file.
|
|
33
|
-
# The line that is saved in the log file shall contain as much information as possible.
|
|
34
|
-
|
|
35
|
-
LOG_FORMAT_FILE = (
|
|
36
|
-
"%(asctime)s:%(processName)s:%(process)s:%(levelname)s:%(lineno)d:%(name)s:%(message)s"
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
LOG_FORMAT_KEY_VALUE = (
|
|
40
|
-
"level=%(levelname)s ts=%(asctime)s process=%(processName)s process_id=%(process)s caller=%(name)s:%(lineno)s msg=\"%(message)s\""
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
LOG_FORMAT_DATE = "%Y-%m-%dT%H:%M:%S,%f"
|
|
44
|
-
|
|
45
|
-
# The format for the console output.
|
|
46
|
-
# The line that is printed on the console shall be concise.
|
|
47
|
-
|
|
48
|
-
LOG_FORMAT_STREAM = "%(asctime)s:%(levelname)s:%(name)s:%(message)s"
|
|
49
|
-
|
|
50
|
-
LOG_RECORDS = Counter(
|
|
51
|
-
"log_records_count", "Count the number of log records processed", ["source", "name"]
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
LOG_LEVEL_FILE = logging.DEBUG
|
|
55
|
-
LOG_LEVEL_STREAM = logging.ERROR
|
|
56
|
-
LOG_LEVEL_SOCKET = 1 # ALL records shall go to the socket handler
|
|
57
|
-
|
|
58
|
-
LOGGER_NAME = "egse.logger.log_cs"
|
|
59
|
-
|
|
60
|
-
file_handler: Optional[TimedRotatingFileHandler] = None
|
|
61
|
-
stream_handler: Optional[StreamHandler] = None
|
|
62
|
-
socket_handler: Optional[SocketHandler] = None
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
class DateTimeFormatter(logging.Formatter):
|
|
66
|
-
|
|
67
|
-
def formatTime(self, record, datefmt=None):
|
|
68
|
-
converted_time = datetime.datetime.fromtimestamp(record.created)
|
|
69
|
-
if datefmt:
|
|
70
|
-
return converted_time.strftime(datefmt)
|
|
71
|
-
formatted_time = converted_time.strftime("%Y-%m-%dT%H:%M:%S")
|
|
72
|
-
return f"{formatted_time}.{record.msecs:03.0f}"
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
file_formatter = DateTimeFormatter(fmt=LOG_FORMAT_KEY_VALUE, datefmt=LOG_FORMAT_DATE)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
@click.group()
|
|
79
|
-
def cli():
|
|
80
|
-
pass
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
@cli.command()
|
|
84
|
-
def start():
|
|
85
|
-
"""Start the Logger Control Server."""
|
|
86
|
-
|
|
87
|
-
global file_handler, stream_handler, socket_handler
|
|
88
|
-
|
|
89
|
-
multiprocessing.current_process().name = "log_cs"
|
|
90
|
-
|
|
91
|
-
start_http_server(CTRL_SETTINGS.METRICS_PORT)
|
|
92
|
-
|
|
93
|
-
# TODO (rik):
|
|
94
|
-
# The `max_*` values should be read from the Settings (DONE) and it shall be possible to
|
|
95
|
-
# overwrite these values from the commandline maybe.
|
|
96
|
-
|
|
97
|
-
max_bytes = CTRL_SETTINGS.MAX_SIZE_LOG_FILES * 1024 * 1024
|
|
98
|
-
max_nr_log_files = CTRL_SETTINGS.MAX_NR_LOG_FILES
|
|
99
|
-
|
|
100
|
-
log_file_location = Path(get_log_file_location())
|
|
101
|
-
if not log_file_location.exists():
|
|
102
|
-
raise FileNotFoundError(f"The location for the log files doesn't exist: {log_file_location!s}.")
|
|
103
|
-
|
|
104
|
-
file_handler = TimedRotatingFileHandler(
|
|
105
|
-
filename=log_file_location / "general.log", when='midnight'
|
|
106
|
-
)
|
|
107
|
-
file_handler.setFormatter(file_formatter)
|
|
108
|
-
|
|
109
|
-
# There is no need to set the level for the handlers, because the level is checked by the
|
|
110
|
-
# Logger and we use the handlers directly here. Use a filter to restrict messages.
|
|
111
|
-
|
|
112
|
-
stream_handler = StreamHandler()
|
|
113
|
-
stream_handler.setFormatter(logging.Formatter(fmt=LOG_FORMAT_STREAM))
|
|
114
|
-
|
|
115
|
-
# Log records are also sent to the cutelog listening server
|
|
116
|
-
|
|
117
|
-
socket_handler = SocketHandler(CTRL_SETTINGS.CUTELOG_IP_ADDRESS, CTRL_SETTINGS.CUTELOG_LISTENING_PORT)
|
|
118
|
-
socket_handler.setFormatter(file_formatter)
|
|
119
|
-
|
|
120
|
-
context = zmq.Context()
|
|
121
|
-
|
|
122
|
-
endpoint = bind_address(CTRL_SETTINGS.PROTOCOL, CTRL_SETTINGS.LOGGING_PORT)
|
|
123
|
-
receiver = context.socket(zmq.PULL)
|
|
124
|
-
receiver.bind(endpoint)
|
|
125
|
-
|
|
126
|
-
endpoint = bind_address(CTRL_SETTINGS.PROTOCOL, CTRL_SETTINGS.COMMANDING_PORT)
|
|
127
|
-
commander = context.socket(zmq.REP)
|
|
128
|
-
commander.bind(endpoint)
|
|
129
|
-
|
|
130
|
-
poller = zmq.Poller()
|
|
131
|
-
poller.register(receiver, zmq.POLLIN)
|
|
132
|
-
poller.register(commander, zmq.POLLIN)
|
|
133
|
-
|
|
134
|
-
while True:
|
|
135
|
-
try:
|
|
136
|
-
socks = dict(poller.poll())
|
|
137
|
-
|
|
138
|
-
if commander in socks:
|
|
139
|
-
pickle_string = commander.recv()
|
|
140
|
-
command = pickle.loads(pickle_string)
|
|
141
|
-
|
|
142
|
-
if command.lower() == "quit":
|
|
143
|
-
commander.send(pickle.dumps("ACK"))
|
|
144
|
-
break
|
|
145
|
-
|
|
146
|
-
response = handle_command(command)
|
|
147
|
-
commander.send(pickle.dumps(response))
|
|
148
|
-
|
|
149
|
-
if receiver in socks:
|
|
150
|
-
pickle_string = receiver.recv()
|
|
151
|
-
record = pickle.loads(pickle_string)
|
|
152
|
-
record = logging.makeLogRecord(record)
|
|
153
|
-
|
|
154
|
-
handle_log_record(record)
|
|
155
|
-
|
|
156
|
-
except KeyboardInterrupt:
|
|
157
|
-
click.echo("KeyboardInterrupt caught!")
|
|
158
|
-
break
|
|
159
|
-
|
|
160
|
-
record = logging.LogRecord(
|
|
161
|
-
name=LOGGER_NAME,
|
|
162
|
-
level=logging.WARNING,
|
|
163
|
-
pathname=__file__,
|
|
164
|
-
lineno=137,
|
|
165
|
-
msg="Logger terminated.",
|
|
166
|
-
args=(),
|
|
167
|
-
exc_info=None,
|
|
168
|
-
func="start",
|
|
169
|
-
sinfo=None
|
|
170
|
-
)
|
|
171
|
-
handle_log_record(record)
|
|
172
|
-
|
|
173
|
-
file_handler.close()
|
|
174
|
-
stream_handler.close()
|
|
175
|
-
commander.close(linger=0)
|
|
176
|
-
receiver.close(linger=0)
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
def handle_log_record(record):
|
|
180
|
-
"""Send the log record to the file handler and the stream handler."""
|
|
181
|
-
global file_handler, stream_handler, socket_handler
|
|
182
|
-
|
|
183
|
-
if record.levelno >= LOG_LEVEL_FILE:
|
|
184
|
-
file_handler.emit(record)
|
|
185
|
-
|
|
186
|
-
if record.levelno >= LOG_LEVEL_STREAM:
|
|
187
|
-
stream_handler.handle(record)
|
|
188
|
-
|
|
189
|
-
if record.levelno >= LOG_LEVEL_SOCKET:
|
|
190
|
-
socket_handler.handle(record)
|
|
191
|
-
|
|
192
|
-
LOG_RECORDS.labels(source="all", name="all").inc()
|
|
193
|
-
LOG_RECORDS.labels(source="logger", name=record.name).inc()
|
|
194
|
-
LOG_RECORDS.labels(source="process", name=record.processName).inc()
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
def handle_command(command) -> dict:
|
|
198
|
-
"""Handle commands that are sent to the commanding socket."""
|
|
199
|
-
global file_handler
|
|
200
|
-
global LOG_LEVEL_FILE
|
|
201
|
-
|
|
202
|
-
response = dict(
|
|
203
|
-
timestamp=format_datetime(),
|
|
204
|
-
)
|
|
205
|
-
if command.lower() == 'roll':
|
|
206
|
-
file_handler.doRollover()
|
|
207
|
-
response.update(dict(status="ACK"))
|
|
208
|
-
record = logging.LogRecord(
|
|
209
|
-
name=LOGGER_NAME,
|
|
210
|
-
level=logging.WARNING,
|
|
211
|
-
pathname=__file__,
|
|
212
|
-
lineno=197,
|
|
213
|
-
msg="Logger rolled over.",
|
|
214
|
-
args=(),
|
|
215
|
-
exc_info=None,
|
|
216
|
-
func="roll",
|
|
217
|
-
sinfo=None
|
|
218
|
-
)
|
|
219
|
-
handle_log_record(record)
|
|
220
|
-
|
|
221
|
-
elif command.lower() == 'status':
|
|
222
|
-
response.update(dict(
|
|
223
|
-
status="ACK",
|
|
224
|
-
file_logger_level=logging.getLevelName(LOG_LEVEL_FILE),
|
|
225
|
-
stream_logger_level=logging.getLevelName(LOG_LEVEL_STREAM),
|
|
226
|
-
file_logger_location=file_handler.baseFilename,
|
|
227
|
-
))
|
|
228
|
-
elif command.lower().startswith("set_level"):
|
|
229
|
-
new_level = command.split()[-1]
|
|
230
|
-
LOG_LEVEL_FILE = logging._nameToLevel[new_level]
|
|
231
|
-
response.update(dict(
|
|
232
|
-
status="ACK",
|
|
233
|
-
file_logger_level=logging.getLevelName(LOG_LEVEL_FILE),
|
|
234
|
-
))
|
|
235
|
-
|
|
236
|
-
return response
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
@cli.command()
|
|
240
|
-
def stop():
|
|
241
|
-
"""Stop the Logger Control Server."""
|
|
242
|
-
|
|
243
|
-
response = send_request("quit")
|
|
244
|
-
if response == "ACK":
|
|
245
|
-
rich.print("Logger successfully terminated.")
|
|
246
|
-
else:
|
|
247
|
-
rich.print(f"[red] ERROR: {response}")
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
@cli.command()
|
|
251
|
-
def roll():
|
|
252
|
-
"""Roll over the log file of the Logger Control Server."""
|
|
253
|
-
|
|
254
|
-
response = send_request("roll")
|
|
255
|
-
if response.get("status") == "ACK":
|
|
256
|
-
rich.print("[green]Logger files successfully rotated.")
|
|
257
|
-
else:
|
|
258
|
-
rich.print(f"[red]ERROR: {response}")
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
@cli.command()
|
|
262
|
-
def status():
|
|
263
|
-
"""Roll over the log file of the Logger Control Server."""
|
|
264
|
-
|
|
265
|
-
rich.print("Log Manager:")
|
|
266
|
-
|
|
267
|
-
response = send_request("status")
|
|
268
|
-
if response.get("status") == "ACK":
|
|
269
|
-
rich.print(" Status: [green]active")
|
|
270
|
-
rich.print(f" Level [grey50](file)[black]: {response.get('file_logger_level')}")
|
|
271
|
-
rich.print(f" Level [grey50](stdout)[black]: {response.get('stream_logger_level')}")
|
|
272
|
-
rich.print(f" Log file location: {response.get('file_logger_location')}")
|
|
273
|
-
else:
|
|
274
|
-
rich.print(" Status: [red]not active")
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
@cli.command()
|
|
278
|
-
@click.argument('level')
|
|
279
|
-
def level(level: Union[int, str]):
|
|
280
|
-
"""Set the logging level for """
|
|
281
|
-
try:
|
|
282
|
-
level = logging.getLevelName(int(level))
|
|
283
|
-
except ValueError:
|
|
284
|
-
if level not in logging._nameToLevel:
|
|
285
|
-
rich.print(f"[red]Invalid logging level given '{level}'.")
|
|
286
|
-
rich.print(f"Should be one of {logging._levelToName}.")
|
|
287
|
-
return
|
|
288
|
-
|
|
289
|
-
response = send_request(f"set_level {level}")
|
|
290
|
-
if response.get("status") == "ACK":
|
|
291
|
-
rich.print(f"Log level on the server is now set to {response.get('file_logger_level')}.")
|
|
292
|
-
else:
|
|
293
|
-
rich.print(f"[red]ERROR: {response}")
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
TIMEOUT_RECV = 1.0 # seconds
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
def send_request(command_request: str):
|
|
300
|
-
"""Sends a request to the Logger Control Server and waits for a response."""
|
|
301
|
-
ctx = zmq.Context().instance()
|
|
302
|
-
endpoint = connect_address(
|
|
303
|
-
CTRL_SETTINGS.PROTOCOL, CTRL_SETTINGS.HOSTNAME, CTRL_SETTINGS.COMMANDING_PORT
|
|
304
|
-
)
|
|
305
|
-
socket = ctx.socket(zmq.REQ)
|
|
306
|
-
socket.connect(endpoint)
|
|
307
|
-
|
|
308
|
-
socket.send(pickle.dumps(command_request))
|
|
309
|
-
rlist, _, _ = zmq.select([socket], [], [], timeout=TIMEOUT_RECV)
|
|
310
|
-
if socket in rlist:
|
|
311
|
-
response = socket.recv()
|
|
312
|
-
response = pickle.loads(response)
|
|
313
|
-
else:
|
|
314
|
-
response = {"error": "Receive from ZeroMQ socket timed out for Logger Control Server."}
|
|
315
|
-
socket.close(linger=0)
|
|
316
|
-
|
|
317
|
-
return response
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
if __name__ == "__main__":
|
|
321
|
-
cli()
|