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/control.py
DELETED
|
@@ -1,442 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module defines the abstract class for any control server and some convenience functions.
|
|
3
|
-
"""
|
|
4
|
-
import abc
|
|
5
|
-
import logging
|
|
6
|
-
import pickle
|
|
7
|
-
import threading
|
|
8
|
-
import time
|
|
9
|
-
from typing import Any
|
|
10
|
-
|
|
11
|
-
import zmq
|
|
12
|
-
|
|
13
|
-
from egse.logger import close_all_zmq_handlers
|
|
14
|
-
from egse.process import ProcessStatus
|
|
15
|
-
from egse.settings import Settings
|
|
16
|
-
from egse.system import do_every
|
|
17
|
-
from egse.system import get_average_execution_time
|
|
18
|
-
from egse.system import get_average_execution_times
|
|
19
|
-
from egse.system import get_full_classname
|
|
20
|
-
from egse.system import get_host_ip
|
|
21
|
-
from egse.system import save_average_execution_time
|
|
22
|
-
|
|
23
|
-
MODULE_LOGGER = logging.getLogger(__name__)
|
|
24
|
-
PROCESS_SETTINGS = Settings.load("PROCESS")
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def time_in_ms():
|
|
28
|
-
"""Returns the current time in milliseconds since the Epoch."""
|
|
29
|
-
return int(round(time.time() * 1000))
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def time_in_s():
|
|
33
|
-
"""Returns the current time in seconds since the Epoch."""
|
|
34
|
-
return time.time()
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def is_control_server_active(endpoint: str = None, timeout: float = 0.5) -> bool:
|
|
38
|
-
"""
|
|
39
|
-
Check if the control server is running. This function sends a *Ping* message to the
|
|
40
|
-
control server and expects a *Pong* answer back within the timeout period.
|
|
41
|
-
|
|
42
|
-
Args:
|
|
43
|
-
endpoint (str): the endpoint to connect to, i.e. <protocol>://<address>:<port>
|
|
44
|
-
timeout (float): timeout when waiting for a reply [seconds, default=0.5]
|
|
45
|
-
Returns:
|
|
46
|
-
True if the Control Server is running and replied with the expected answer.
|
|
47
|
-
"""
|
|
48
|
-
ctx = zmq.Context.instance()
|
|
49
|
-
|
|
50
|
-
return_code = False
|
|
51
|
-
|
|
52
|
-
try:
|
|
53
|
-
socket = ctx.socket(zmq.REQ)
|
|
54
|
-
socket.connect(endpoint)
|
|
55
|
-
data = pickle.dumps("Ping")
|
|
56
|
-
socket.send(data)
|
|
57
|
-
rlist, _, _ = zmq.select([socket], [], [], timeout=timeout)
|
|
58
|
-
if socket in rlist:
|
|
59
|
-
data = socket.recv()
|
|
60
|
-
response = pickle.loads(data)
|
|
61
|
-
return_code = response == "Pong"
|
|
62
|
-
socket.close(linger=0)
|
|
63
|
-
except Exception as exc:
|
|
64
|
-
MODULE_LOGGER.warning(f"Caught an exception while pinging a control server at {endpoint}: {exc}.")
|
|
65
|
-
|
|
66
|
-
return return_code
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
class Response:
|
|
70
|
-
"""Base class for any reply or response between client-server communication.
|
|
71
|
-
|
|
72
|
-
The idea is that the response is encapsulated in one of the subclasses depending
|
|
73
|
-
on the type of response.
|
|
74
|
-
"""
|
|
75
|
-
|
|
76
|
-
def __init__(self, message: str):
|
|
77
|
-
self.message = message
|
|
78
|
-
|
|
79
|
-
def __str__(self):
|
|
80
|
-
return self.message
|
|
81
|
-
|
|
82
|
-
@property
|
|
83
|
-
def successful(self):
|
|
84
|
-
"""Returns True if the Response is not an Exception."""
|
|
85
|
-
return not isinstance(self, Exception)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
class Failure(Response, Exception):
|
|
89
|
-
"""A failure response indicating something went wrong at the other side.
|
|
90
|
-
|
|
91
|
-
This class is used to encapsulate an Exception that was caught and needs to be
|
|
92
|
-
passed to the client. So, the intended use is like this:
|
|
93
|
-
```
|
|
94
|
-
try:
|
|
95
|
-
# perform some useful action that might raise an Exception
|
|
96
|
-
except SomeException as exc:
|
|
97
|
-
return Failure("Our action failed", exc)
|
|
98
|
-
```
|
|
99
|
-
The client can inspect the Exception that was originally raised, in this case `SomeException`
|
|
100
|
-
with the `cause` variable.
|
|
101
|
-
|
|
102
|
-
Since a Failure is also an Exception, the property `successful` will return False.
|
|
103
|
-
So, the calling method can test for this easily.
|
|
104
|
-
|
|
105
|
-
```
|
|
106
|
-
rc: Response = function_that_returns_a_response()
|
|
107
|
-
|
|
108
|
-
if not rc.successful:
|
|
109
|
-
# handle the failure
|
|
110
|
-
else:
|
|
111
|
-
# handle success
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
"""
|
|
115
|
-
|
|
116
|
-
def __init__(self, message: str, cause: Exception = None):
|
|
117
|
-
msg = f"{message}: {cause}" if cause is not None else message
|
|
118
|
-
super().__init__(msg)
|
|
119
|
-
self.cause = cause
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
class Success(Response):
|
|
123
|
-
"""A success response for the client.
|
|
124
|
-
|
|
125
|
-
The return code from any action or function that needs to be returned to the
|
|
126
|
-
client shall be added.
|
|
127
|
-
|
|
128
|
-
Since `Success` doesn't inherit from `Exception`, the property `successful` will return True.
|
|
129
|
-
"""
|
|
130
|
-
|
|
131
|
-
def __init__(self, message: str, return_code: Any = None):
|
|
132
|
-
msg = f"{message}: {return_code}" if return_code is not None else message
|
|
133
|
-
super().__init__(msg)
|
|
134
|
-
self.return_code = return_code
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
class Message(Response):
|
|
138
|
-
"""A message response from the client.
|
|
139
|
-
|
|
140
|
-
Send a Message when there is no Failure, but also no return code. This is the alternative of
|
|
141
|
-
returning a None.
|
|
142
|
-
|
|
143
|
-
Message returns True for the property successful since it doesn't inherit from Exception.
|
|
144
|
-
"""
|
|
145
|
-
|
|
146
|
-
pass
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
class ControlServer(metaclass=abc.ABCMeta):
|
|
150
|
-
"""
|
|
151
|
-
The base class for all device control servers and for the Storage Manager and Configuration
|
|
152
|
-
Manager. A Control Server reads commands from a ZeroMQ socket and executes these commands by
|
|
153
|
-
calling the `execute()` method of the commanding protocol class.
|
|
154
|
-
|
|
155
|
-
The sub-class shall define the following:
|
|
156
|
-
|
|
157
|
-
* Define the device protocol class -> `self.device_protocol`
|
|
158
|
-
* Bind the command socket to the device protocol -> `self.dev_ctrl_cmd_sock`
|
|
159
|
-
* Register the command socket in the poll set -> `self.poller`
|
|
160
|
-
|
|
161
|
-
"""
|
|
162
|
-
|
|
163
|
-
def __init__(self):
|
|
164
|
-
from egse.monitoring import MonitoringProtocol
|
|
165
|
-
from egse.services import ServiceProtocol
|
|
166
|
-
|
|
167
|
-
self._process_status = ProcessStatus()
|
|
168
|
-
|
|
169
|
-
self._timer_thread = threading.Thread(
|
|
170
|
-
target=do_every, args=(PROCESS_SETTINGS.METRICS_INTERVAL, self._process_status.update))
|
|
171
|
-
self._timer_thread.daemon = True
|
|
172
|
-
self._timer_thread.start()
|
|
173
|
-
|
|
174
|
-
# The logger will be overwritten by the sub-class, if not, then we use this logger
|
|
175
|
-
# with the name of the sub-class. That will help us to identify which sub-class did not
|
|
176
|
-
# overwrite the logger attribute.
|
|
177
|
-
|
|
178
|
-
self.logger = logging.getLogger(get_full_classname(self))
|
|
179
|
-
|
|
180
|
-
self.interrupted = False
|
|
181
|
-
self.delay = 1000 # delay between publish status information [milliseconds]
|
|
182
|
-
self.hk_delay = 1000 # delay between saving housekeeping information [milliseconds]
|
|
183
|
-
|
|
184
|
-
self.zcontext = zmq.Context.instance()
|
|
185
|
-
self.poller = zmq.Poller()
|
|
186
|
-
|
|
187
|
-
self.device_protocol = None # This will be set in the sub-class
|
|
188
|
-
self.service_protocol = ServiceProtocol(self)
|
|
189
|
-
self.monitoring_protocol = MonitoringProtocol(self)
|
|
190
|
-
|
|
191
|
-
# Setup the control server waiting for service requests
|
|
192
|
-
|
|
193
|
-
self.dev_ctrl_service_sock = self.zcontext.socket(zmq.REP)
|
|
194
|
-
self.service_protocol.bind(self.dev_ctrl_service_sock)
|
|
195
|
-
|
|
196
|
-
# Setup the control server for sending monitoring info
|
|
197
|
-
|
|
198
|
-
self.dev_ctrl_mon_sock = self.zcontext.socket(zmq.PUB)
|
|
199
|
-
self.monitoring_protocol.bind(self.dev_ctrl_mon_sock)
|
|
200
|
-
|
|
201
|
-
# Setup the control server waiting for device commands.
|
|
202
|
-
# The device protocol shall bind the socket in the sub-class
|
|
203
|
-
|
|
204
|
-
self.dev_ctrl_cmd_sock = self.zcontext.socket(zmq.REP)
|
|
205
|
-
|
|
206
|
-
# Initialize the poll set
|
|
207
|
-
|
|
208
|
-
self.poller.register(self.dev_ctrl_service_sock, zmq.POLLIN)
|
|
209
|
-
self.poller.register(self.dev_ctrl_mon_sock, zmq.POLLIN)
|
|
210
|
-
|
|
211
|
-
@abc.abstractmethod
|
|
212
|
-
def get_communication_protocol(self):
|
|
213
|
-
pass
|
|
214
|
-
|
|
215
|
-
@abc.abstractmethod
|
|
216
|
-
def get_commanding_port(self):
|
|
217
|
-
pass
|
|
218
|
-
|
|
219
|
-
@abc.abstractmethod
|
|
220
|
-
def get_service_port(self):
|
|
221
|
-
pass
|
|
222
|
-
|
|
223
|
-
@abc.abstractmethod
|
|
224
|
-
def get_monitoring_port(self):
|
|
225
|
-
pass
|
|
226
|
-
|
|
227
|
-
def get_ip_address(self):
|
|
228
|
-
return get_host_ip()
|
|
229
|
-
|
|
230
|
-
def get_storage_mnemonic(self):
|
|
231
|
-
return self.__class__.__name__
|
|
232
|
-
|
|
233
|
-
def get_process_status(self):
|
|
234
|
-
return self._process_status.as_dict()
|
|
235
|
-
|
|
236
|
-
def get_average_execution_times(self):
|
|
237
|
-
return get_average_execution_times()
|
|
238
|
-
|
|
239
|
-
def set_delay(self, seconds: float) -> float:
|
|
240
|
-
"""
|
|
241
|
-
Sets the delay time for monitoring. The delay time is the time between two successive executions of the
|
|
242
|
-
`get_status()` function of the device protocol.
|
|
243
|
-
|
|
244
|
-
It might happen that the delay time that is set is longer than what you requested. That is the case when
|
|
245
|
-
the execution of the `get_status()` function takes longer than the requested delay time. That should
|
|
246
|
-
prevent the server from blocking when a too short delay time is requested.
|
|
247
|
-
|
|
248
|
-
Args:
|
|
249
|
-
seconds: the number of seconds between the monitoring calls.
|
|
250
|
-
Returns:
|
|
251
|
-
The delay that was set in milliseconds.
|
|
252
|
-
"""
|
|
253
|
-
execution_time = get_average_execution_time(self.device_protocol.get_status)
|
|
254
|
-
self.delay = max(seconds * 1000, (execution_time + 0.2) * 1000)
|
|
255
|
-
return self.delay
|
|
256
|
-
|
|
257
|
-
def set_hk_delay(self, seconds) -> float:
|
|
258
|
-
"""
|
|
259
|
-
Sets the delay time for housekeeping. The delay time is the time between two successive executions of the
|
|
260
|
-
`get_housekeeping()` function of the device protocol.
|
|
261
|
-
|
|
262
|
-
It might happen that the delay time that is set is longer than what you requested. That is the case when
|
|
263
|
-
the execution of the `get_housekeeping()` function takes longer than the requested delay time. That should
|
|
264
|
-
prevent the server from blocking when a too short delay time is requested.
|
|
265
|
-
|
|
266
|
-
Args:
|
|
267
|
-
seconds: the number of seconds between the housekeeping calls.
|
|
268
|
-
Returns:
|
|
269
|
-
The delay that was set in milliseconds.
|
|
270
|
-
"""
|
|
271
|
-
execution_time = get_average_execution_time(self.device_protocol.get_housekeeping)
|
|
272
|
-
self.hk_delay = max(seconds * 1000, (execution_time + 0.2) * 1000)
|
|
273
|
-
return self.hk_delay
|
|
274
|
-
|
|
275
|
-
def set_logging_level(self, level):
|
|
276
|
-
self.logger.setLevel(level=level)
|
|
277
|
-
|
|
278
|
-
def quit(self):
|
|
279
|
-
self.interrupted = True
|
|
280
|
-
|
|
281
|
-
def before_serve(self):
|
|
282
|
-
pass
|
|
283
|
-
|
|
284
|
-
def after_serve(self):
|
|
285
|
-
pass
|
|
286
|
-
|
|
287
|
-
def serve(self):
|
|
288
|
-
|
|
289
|
-
self.before_serve()
|
|
290
|
-
|
|
291
|
-
# check if Storage Manager is available
|
|
292
|
-
|
|
293
|
-
from egse.storage import is_storage_manager_active
|
|
294
|
-
|
|
295
|
-
storage_manager = is_storage_manager_active(timeout=0.1)
|
|
296
|
-
|
|
297
|
-
storage_manager and self.register_to_storage_manager()
|
|
298
|
-
|
|
299
|
-
# This approach is very simplistic and not time efficient
|
|
300
|
-
# We probably want to use a Timer that executes the monitoring and saving actions at
|
|
301
|
-
# dedicated times in the background.
|
|
302
|
-
|
|
303
|
-
last_time = time_in_ms()
|
|
304
|
-
last_time_hk = time_in_ms()
|
|
305
|
-
|
|
306
|
-
while True:
|
|
307
|
-
try:
|
|
308
|
-
socks = dict(self.poller.poll(50)) # timeout in milliseconds, do not block
|
|
309
|
-
except KeyboardInterrupt:
|
|
310
|
-
self.logger.warning("Keyboard interrupt caught!")
|
|
311
|
-
self.logger.warning(
|
|
312
|
-
"The ControlServer can not be interrupted with CTRL-C, "
|
|
313
|
-
"send a quit command to the server."
|
|
314
|
-
)
|
|
315
|
-
continue
|
|
316
|
-
|
|
317
|
-
if self.dev_ctrl_cmd_sock in socks:
|
|
318
|
-
self.device_protocol.execute()
|
|
319
|
-
|
|
320
|
-
if self.dev_ctrl_service_sock in socks:
|
|
321
|
-
self.service_protocol.execute()
|
|
322
|
-
|
|
323
|
-
# Now handle the periodic sending out of status information. A dictionary with the
|
|
324
|
-
# status or HK info is sent out periodically based on the DELAY time that is in the
|
|
325
|
-
# YAML config file.
|
|
326
|
-
|
|
327
|
-
if time_in_ms() - last_time >= self.delay:
|
|
328
|
-
last_time = time_in_ms()
|
|
329
|
-
# self.logger.debug("Sending status to monitoring processes.")
|
|
330
|
-
self.monitoring_protocol.send_status(
|
|
331
|
-
save_average_execution_time(self.device_protocol.get_status)
|
|
332
|
-
)
|
|
333
|
-
|
|
334
|
-
if time_in_ms() - last_time_hk >= self.hk_delay:
|
|
335
|
-
last_time_hk = time_in_ms()
|
|
336
|
-
if storage_manager:
|
|
337
|
-
# self.logger.debug("Sending housekeeping information to Storage.")
|
|
338
|
-
self.store_housekeeping_information(
|
|
339
|
-
save_average_execution_time(self.device_protocol.get_housekeeping)
|
|
340
|
-
)
|
|
341
|
-
|
|
342
|
-
if self.interrupted:
|
|
343
|
-
self.logger.info(
|
|
344
|
-
f"Quit command received, closing down the {self.__class__.__name__}."
|
|
345
|
-
)
|
|
346
|
-
break
|
|
347
|
-
|
|
348
|
-
# Some device protocol sub-classes might start a number of threads or processes to
|
|
349
|
-
# support the commanding. Check if these threads/processes are still alive and
|
|
350
|
-
# terminate gracefully if they are not.
|
|
351
|
-
|
|
352
|
-
if not self.device_protocol.is_alive():
|
|
353
|
-
self.logger.error(
|
|
354
|
-
"Some Thread or sub-process that was started by Protocol has "
|
|
355
|
-
"died, terminating..."
|
|
356
|
-
)
|
|
357
|
-
break
|
|
358
|
-
|
|
359
|
-
storage_manager and self.unregister_from_storage_manager()
|
|
360
|
-
|
|
361
|
-
self.after_serve()
|
|
362
|
-
|
|
363
|
-
self.device_protocol.quit()
|
|
364
|
-
|
|
365
|
-
self.dev_ctrl_mon_sock.close()
|
|
366
|
-
self.dev_ctrl_service_sock.close()
|
|
367
|
-
self.dev_ctrl_cmd_sock.close()
|
|
368
|
-
|
|
369
|
-
close_all_zmq_handlers()
|
|
370
|
-
|
|
371
|
-
self.zcontext.term()
|
|
372
|
-
|
|
373
|
-
def store_housekeeping_information(self, data):
|
|
374
|
-
"""Send housekeeping information to the Storage manager."""
|
|
375
|
-
|
|
376
|
-
from egse.storage.storage_cs import StorageControlServer
|
|
377
|
-
from egse.storage import StorageProxy
|
|
378
|
-
|
|
379
|
-
if isinstance(self, StorageControlServer):
|
|
380
|
-
self.logger.log(0, f"{self.__class__.__name__} doesn't store housekeeping information.")
|
|
381
|
-
return
|
|
382
|
-
|
|
383
|
-
self.logger.log(0, "Sending housekeeping to storage manager.")
|
|
384
|
-
|
|
385
|
-
try:
|
|
386
|
-
with StorageProxy() as proxy:
|
|
387
|
-
rc = proxy.save({"origin": self.get_storage_mnemonic(), "data": data})
|
|
388
|
-
if not rc.successful:
|
|
389
|
-
self.logger.warning(
|
|
390
|
-
f"Couldn't save data to the Storage manager: {data}, cause: {rc}"
|
|
391
|
-
)
|
|
392
|
-
except ConnectionError as exc:
|
|
393
|
-
self.logger.warning(
|
|
394
|
-
f"Couldn't connect to the Storage manager to store housekeeping: {exc}"
|
|
395
|
-
)
|
|
396
|
-
|
|
397
|
-
def register_to_storage_manager(self):
|
|
398
|
-
"""Register this ControlServer to the Storage manager."""
|
|
399
|
-
|
|
400
|
-
from egse.storage.storage_cs import StorageControlServer
|
|
401
|
-
from egse.storage import StorageProxy
|
|
402
|
-
from egse.storage.persistence import CSV
|
|
403
|
-
|
|
404
|
-
if isinstance(self, StorageControlServer):
|
|
405
|
-
return
|
|
406
|
-
|
|
407
|
-
try:
|
|
408
|
-
with StorageProxy() as proxy:
|
|
409
|
-
rc = proxy.register(
|
|
410
|
-
{
|
|
411
|
-
"origin": self.get_storage_mnemonic(),
|
|
412
|
-
"persistence_class": CSV,
|
|
413
|
-
"prep": {
|
|
414
|
-
"column_names": list(self.device_protocol.get_housekeeping().keys()),
|
|
415
|
-
"mode": "a",
|
|
416
|
-
},
|
|
417
|
-
}
|
|
418
|
-
)
|
|
419
|
-
if not rc.successful:
|
|
420
|
-
self.logger.warning(f"Couldn't register to the Storage manager: {rc}")
|
|
421
|
-
except ConnectionError as exc:
|
|
422
|
-
self.logger.warning(f"Couldn't connect to the Storage manager for registration: {exc}")
|
|
423
|
-
|
|
424
|
-
def unregister_from_storage_manager(self):
|
|
425
|
-
"""Unregister this ControlServer from the Storage manager."""
|
|
426
|
-
|
|
427
|
-
from egse.storage.storage_cs import StorageControlServer
|
|
428
|
-
from egse.storage import StorageProxy
|
|
429
|
-
|
|
430
|
-
if isinstance(self, StorageControlServer):
|
|
431
|
-
return
|
|
432
|
-
|
|
433
|
-
try:
|
|
434
|
-
with StorageProxy() as proxy:
|
|
435
|
-
rc = proxy.unregister({"origin": self.get_storage_mnemonic()})
|
|
436
|
-
if not rc.successful:
|
|
437
|
-
self.logger.warning(f"Couldn't unregister from the Storage manager: {rc}")
|
|
438
|
-
|
|
439
|
-
except ConnectionError as exc:
|
|
440
|
-
self.logger.warning(
|
|
441
|
-
f"Couldn't connect to the Storage manager for de-registration: {exc}"
|
|
442
|
-
)
|