cgse 2024.7.0__py3-none-any.whl → 2025.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- README.md +27 -0
- bump.py +85 -0
- cgse-2025.0.2.dist-info/METADATA +38 -0
- cgse-2025.0.2.dist-info/RECORD +5 -0
- {cgse-2024.7.0.dist-info → cgse-2025.0.2.dist-info}/WHEEL +1 -2
- cgse-2024.7.0.dist-info/COPYING +0 -674
- cgse-2024.7.0.dist-info/COPYING.LESSER +0 -165
- cgse-2024.7.0.dist-info/METADATA +0 -144
- cgse-2024.7.0.dist-info/RECORD +0 -660
- cgse-2024.7.0.dist-info/entry_points.txt +0 -75
- cgse-2024.7.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5238
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -627
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -903
- egse/aeu/aeu_metrics.py +0 -131
- egse/aeu/aeu_protocol.py +0 -463
- egse/aeu/aeu_psu.yaml +0 -204
- egse/aeu/aeu_ui.py +0 -873
- egse/aeu/arbdata/FccdRead.arb +0 -2
- egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
- egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/ccdRead25.arb +0 -2
- egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead50.arb +0 -2
- egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
- egse/alert/__init__.py +0 -1049
- egse/alert/alertman.yaml +0 -37
- egse/alert/alertman_cs.py +0 -233
- egse/alert/alertman_ui.py +0 -600
- egse/alert/gsm/beaglebone.py +0 -138
- egse/alert/gsm/beaglebone.yaml +0 -51
- egse/alert/gsm/beaglebone_cs.py +0 -108
- egse/alert/gsm/beaglebone_devif.py +0 -122
- egse/alert/gsm/beaglebone_protocol.py +0 -46
- egse/bits.py +0 -318
- egse/camera.py +0 -44
- egse/collimator/__init__.py +0 -0
- egse/collimator/fcul/__init__.py +0 -0
- egse/collimator/fcul/ogse.py +0 -1077
- egse/collimator/fcul/ogse.yaml +0 -14
- egse/collimator/fcul/ogse_cs.py +0 -154
- egse/collimator/fcul/ogse_devif.py +0 -358
- egse/collimator/fcul/ogse_protocol.py +0 -132
- egse/collimator/fcul/ogse_sim.py +0 -431
- egse/collimator/fcul/ogse_ui.py +0 -1108
- egse/command.py +0 -699
- egse/config.py +0 -410
- egse/confman/__init__.py +0 -1058
- egse/confman/confman.yaml +0 -70
- egse/confman/confman_cs.py +0 -240
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -632
- egse/coordinates/__init__.py +0 -534
- egse/coordinates/avoidance.py +0 -100
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -122
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -194
- egse/coordinates/referenceFrame.py +0 -1279
- egse/coordinates/refmodel.py +0 -737
- egse/coordinates/rotationMatrix.py +0 -85
- egse/coordinates/transform3d_addon.py +0 -419
- egse/csl/__init__.py +0 -50
- egse/csl/commanding.py +0 -78
- egse/csl/icons/hexapod-connected-selected.svg +0 -30
- egse/csl/icons/hexapod-connected.svg +0 -30
- egse/csl/icons/hexapod-homing-selected.svg +0 -68
- egse/csl/icons/hexapod-homing.svg +0 -68
- egse/csl/icons/hexapod-retract-selected.svg +0 -56
- egse/csl/icons/hexapod-retract.svg +0 -51
- egse/csl/icons/hexapod-zero-selected.svg +0 -56
- egse/csl/icons/hexapod-zero.svg +0 -56
- egse/csl/icons/logo-puna.svg +0 -92
- egse/csl/icons/stop.svg +0 -1
- egse/csl/initialisation.py +0 -102
- egse/csl/mech_pos_settings.yaml +0 -18
- egse/das.py +0 -1240
- egse/das.yaml +0 -7
- egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
- egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
- egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
- egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
- egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
- egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
- egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
- egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
- egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
- egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
- egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
- egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
- egse/decorators.py +0 -514
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2698
- egse/dpu/ccd_ui.py +0 -514
- egse/dpu/dpu.py +0 -783
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -671
- egse/dpu/fitsgen.py +0 -2096
- egse/dpu/fitsgen_ui.py +0 -399
- egse/dpu/hdf5_model.py +0 -332
- egse/dpu/hdf5_ui.py +0 -277
- egse/dpu/hdf5_viewer.py +0 -506
- egse/dpu/hk_ui.py +0 -468
- egse/dpu_commands.py +0 -81
- egse/dsi/__init__.py +0 -33
- egse/dsi/_libesl.py +0 -232
- egse/dsi/constants.py +0 -296
- egse/dsi/esl.py +0 -630
- egse/dsi/rmap.py +0 -444
- egse/dsi/rmapci.py +0 -39
- egse/dsi/spw.py +0 -335
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -318
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -26
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -37
- egse/fdir/fdir_manager_controller.py +0 -136
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -15
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -30
- egse/fdir/fdir_remote_controller.py +0 -30
- egse/fdir/fdir_remote_cs.py +0 -94
- egse/fdir/fdir_remote_interface.py +0 -9
- egse/fdir/fdir_remote_popup.py +0 -26
- egse/fee/__init__.py +0 -106
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/feesim.py +0 -914
- egse/fee/n_fee_hk.py +0 -768
- egse/fee/nfee.py +0 -188
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -49
- egse/filterwheel/eksma/fw8smc4.py +0 -657
- egse/filterwheel/eksma/fw8smc4.yaml +0 -121
- egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
- egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
- egse/filterwheel/eksma/fw8smc4_protocol.py +0 -82
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -115
- egse/filterwheel/eksma/fw8smc5.yaml +0 -105
- egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
- egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
- egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
- egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
- egse/filterwheel/eksma/fw8smc5_ui.py +0 -1065
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -710
- egse/fov/fov_ui.py +0 -859
- egse/fov/fov_ui_controller.py +0 -140
- egse/fov/fov_ui_model.py +0 -200
- egse/fov/fov_ui_view.py +0 -345
- egse/gimbal/__init__.py +0 -32
- egse/gimbal/symetrie/__init__.py +0 -26
- egse/gimbal/symetrie/alpha.py +0 -586
- egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
- egse/gimbal/symetrie/gimbal.py +0 -877
- egse/gimbal/symetrie/gimbal.yaml +0 -168
- egse/gimbal/symetrie/gimbal_cs.py +0 -183
- egse/gimbal/symetrie/gimbal_protocol.py +0 -138
- egse/gimbal/symetrie/gimbal_ui.py +0 -361
- egse/gimbal/symetrie/pmac.py +0 -1006
- egse/gimbal/symetrie/pmac_regex.py +0 -83
- egse/graph.py +0 -132
- egse/gui/__init__.py +0 -47
- egse/gui/buttons.py +0 -378
- egse/gui/focalplane.py +0 -1285
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -587
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- egse/gui/styles.qss +0 -48
- egse/gui/switch.py +0 -112
- egse/h5.py +0 -274
- egse/help/__init__.py +0 -0
- egse/help/help_ui.py +0 -126
- egse/hexapod/__init__.py +0 -32
- egse/hexapod/symetrie/__init__.py +0 -137
- egse/hexapod/symetrie/alpha.py +0 -874
- egse/hexapod/symetrie/dynalpha.py +0 -1387
- egse/hexapod/symetrie/hexapod_ui.py +0 -1516
- egse/hexapod/symetrie/pmac.py +0 -1010
- egse/hexapod/symetrie/pmac_regex.py +0 -83
- egse/hexapod/symetrie/puna.py +0 -1167
- egse/hexapod/symetrie/puna.yaml +0 -193
- egse/hexapod/symetrie/puna_cs.py +0 -195
- egse/hexapod/symetrie/puna_protocol.py +0 -134
- egse/hexapod/symetrie/puna_ui.py +0 -433
- egse/hexapod/symetrie/punaplus.py +0 -107
- egse/hexapod/symetrie/zonda.py +0 -872
- egse/hexapod/symetrie/zonda.yaml +0 -337
- egse/hexapod/symetrie/zonda_cs.py +0 -172
- egse/hexapod/symetrie/zonda_devif.py +0 -414
- egse/hexapod/symetrie/zonda_protocol.py +0 -123
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -791
- egse/icons/aeu-cs-start.svg +0 -117
- egse/icons/aeu-cs-stop.svg +0 -118
- egse/icons/aeu-cs.svg +0 -107
- egse/icons/aeu_cs-started.svg +0 -112
- egse/icons/aeu_cs-stopped.svg +0 -112
- egse/icons/aeu_cs.svg +0 -55
- egse/icons/alert.svg +0 -1
- egse/icons/arrow-double-left.png +0 -0
- egse/icons/arrow-double-right.png +0 -0
- egse/icons/arrow-up.svg +0 -11
- egse/icons/backward.svg +0 -1
- egse/icons/busy.svg +0 -1
- egse/icons/cleaning.svg +0 -115
- egse/icons/color-scheme.svg +0 -1
- egse/icons/cs-connected-alert.svg +0 -91
- egse/icons/cs-connected-disabled.svg +0 -43
- egse/icons/cs-connected.svg +0 -89
- egse/icons/cs-not-connected.svg +0 -44
- egse/icons/double-left-arrow.svg +0 -1
- egse/icons/double-right-arrow.svg +0 -1
- egse/icons/erase-disabled.svg +0 -19
- egse/icons/erase.svg +0 -59
- egse/icons/fitsgen-start.svg +0 -47
- egse/icons/fitsgen-stop.svg +0 -48
- egse/icons/fitsgen.svg +0 -1
- egse/icons/forward.svg +0 -1
- egse/icons/fov-hk-start.svg +0 -33
- egse/icons/fov-hk-stop.svg +0 -37
- egse/icons/fov-hk.svg +0 -1
- egse/icons/front-desk.svg +0 -1
- egse/icons/home-actioned.svg +0 -15
- egse/icons/home-disabled.svg +0 -15
- egse/icons/home.svg +0 -13
- egse/icons/info.svg +0 -1
- egse/icons/invalid.png +0 -0
- egse/icons/led-green.svg +0 -20
- egse/icons/led-grey.svg +0 -20
- egse/icons/led-orange.svg +0 -20
- egse/icons/led-red.svg +0 -20
- egse/icons/led-square-green.svg +0 -134
- egse/icons/led-square-grey.svg +0 -134
- egse/icons/led-square-orange.svg +0 -134
- egse/icons/led-square-red.svg +0 -134
- egse/icons/limit-switch-all-green.svg +0 -115
- egse/icons/limit-switch-all-red.svg +0 -117
- egse/icons/limit-switch-el+.svg +0 -116
- egse/icons/limit-switch-el-.svg +0 -117
- egse/icons/location-marker.svg +0 -1
- egse/icons/logo-dpu.svg +0 -48
- egse/icons/logo-gimbal.svg +0 -112
- egse/icons/logo-huber.svg +0 -23
- egse/icons/logo-ogse.svg +0 -31
- egse/icons/logo-puna.svg +0 -92
- egse/icons/logo-tcs.svg +0 -29
- egse/icons/logo-zonda.svg +0 -66
- egse/icons/maximize.svg +0 -1
- egse/icons/meter.svg +0 -1
- egse/icons/more.svg +0 -45
- egse/icons/n-fee-hk-start.svg +0 -24
- egse/icons/n-fee-hk-stop.svg +0 -25
- egse/icons/n-fee-hk.svg +0 -83
- egse/icons/observing-off.svg +0 -46
- egse/icons/observing-on.svg +0 -46
- egse/icons/open-document-hdf5.png +0 -0
- egse/icons/open-document-hdf5.svg +0 -21
- egse/icons/ops-mode.svg +0 -1
- egse/icons/play-green.svg +0 -17
- egse/icons/plugged-disabled.svg +0 -27
- egse/icons/plugged.svg +0 -21
- egse/icons/pm_ui.svg +0 -1
- egse/icons/power-button-green.svg +0 -27
- egse/icons/power-button-red.svg +0 -27
- egse/icons/power-button.svg +0 -27
- egse/icons/radar.svg +0 -1
- egse/icons/radioactive.svg +0 -2
- egse/icons/reload.svg +0 -1
- egse/icons/remote-control-off.svg +0 -28
- egse/icons/remote-control-on.svg +0 -28
- egse/icons/repeat-blue.svg +0 -15
- egse/icons/repeat.svg +0 -1
- egse/icons/settings.svg +0 -1
- egse/icons/shrink.svg +0 -1
- egse/icons/shutter.svg +0 -1
- egse/icons/sign-off.svg +0 -1
- egse/icons/sign-on.svg +0 -1
- egse/icons/sim-mode.svg +0 -1
- egse/icons/small-buttons-go.svg +0 -20
- egse/icons/small-buttons-minus.svg +0 -51
- egse/icons/small-buttons-plus.svg +0 -51
- egse/icons/sponge.svg +0 -220
- egse/icons/start-button-disabled.svg +0 -84
- egse/icons/start-button.svg +0 -50
- egse/icons/stop-button-disabled.svg +0 -84
- egse/icons/stop-button.svg +0 -50
- egse/icons/stop-red.svg +0 -17
- egse/icons/stop.svg +0 -1
- egse/icons/switch-disabled-square.svg +0 -87
- egse/icons/switch-disabled.svg +0 -15
- egse/icons/switch-off-square.svg +0 -87
- egse/icons/switch-off.svg +0 -72
- egse/icons/switch-on-square.svg +0 -87
- egse/icons/switch-on.svg +0 -61
- egse/icons/temperature-control.svg +0 -44
- egse/icons/th_ui_logo.svg +0 -1
- egse/icons/unplugged.svg +0 -23
- egse/icons/unvalid.png +0 -0
- egse/icons/user-interface.svg +0 -1
- egse/icons/vacuum.svg +0 -1
- egse/icons/valid.png +0 -0
- egse/icons/zoom-to-pixel-dark.svg +0 -64
- egse/icons/zoom-to-pixel-white.svg +0 -36
- egse/images/big-rotation-stage.png +0 -0
- egse/images/connected-100.png +0 -0
- egse/images/cross.svg +0 -6
- egse/images/disconnected-100.png +0 -0
- egse/images/gui-icon.png +0 -0
- egse/images/home.svg +0 -6
- egse/images/info-icon.png +0 -0
- egse/images/led-black.svg +0 -89
- egse/images/led-green.svg +0 -85
- egse/images/led-orange.svg +0 -85
- egse/images/led-red.svg +0 -85
- egse/images/load-icon.png +0 -0
- egse/images/load-setup.png +0 -0
- egse/images/load.png +0 -0
- egse/images/pause.png +0 -0
- egse/images/play-button.svg +0 -8
- egse/images/play.png +0 -0
- egse/images/process-status.png +0 -0
- egse/images/restart.png +0 -0
- egse/images/search.png +0 -0
- egse/images/sma.png +0 -0
- egse/images/start.png +0 -0
- egse/images/stop-button.svg +0 -8
- egse/images/stop.png +0 -0
- egse/images/switch-off.svg +0 -48
- egse/images/switch-on.svg +0 -48
- egse/images/undo.png +0 -0
- egse/images/update-button.svg +0 -11
- egse/imageviewer/exposureselection.py +0 -475
- egse/imageviewer/imageviewer.py +0 -198
- egse/imageviewer/matchfocalplane.py +0 -179
- egse/imageviewer/subfieldposition.py +0 -133
- egse/lampcontrol/__init__.py +0 -4
- egse/lampcontrol/beaglebone/beaglebone.py +0 -178
- egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
- egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
- egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
- egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
- egse/lampcontrol/energetiq/__init__.py +0 -22
- egse/lampcontrol/energetiq/eq99.yaml +0 -98
- egse/lampcontrol/energetiq/lampEQ99.py +0 -283
- egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
- egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
- egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
- egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -71
- egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
- egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
- egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
- egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
- egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
- egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
- egse/lib/ximc/libximc.framework/libbindy.so +0 -0
- egse/lib/ximc/libximc.framework/libximc +0 -0
- egse/lib/ximc/libximc.framework/libximc.so +0 -0
- egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
- egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
- egse/lib/ximc/pyximc.py +0 -922
- egse/listener.py +0 -179
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -102
- egse/mixin.py +0 -464
- egse/monitoring.py +0 -95
- egse/ni/alarms/__init__.py +0 -26
- egse/ni/alarms/cdaq9375.py +0 -300
- egse/ni/alarms/cdaq9375.yaml +0 -89
- egse/ni/alarms/cdaq9375_cs.py +0 -130
- egse/ni/alarms/cdaq9375_devif.py +0 -183
- egse/ni/alarms/cdaq9375_protocol.py +0 -48
- egse/obs_inspection.py +0 -165
- egse/observer.py +0 -41
- egse/obsid.py +0 -163
- egse/powermeter/__init__.py +0 -0
- egse/powermeter/ni/__init__.py +0 -38
- egse/powermeter/ni/cdaq9184.py +0 -224
- egse/powermeter/ni/cdaq9184.yaml +0 -73
- egse/powermeter/ni/cdaq9184_cs.py +0 -130
- egse/powermeter/ni/cdaq9184_devif.py +0 -201
- egse/powermeter/ni/cdaq9184_protocol.py +0 -48
- egse/powermeter/ni/cdaq9184_ui.py +0 -544
- egse/powermeter/thorlabs/__init__.py +0 -25
- egse/powermeter/thorlabs/pm100a.py +0 -380
- egse/powermeter/thorlabs/pm100a.yaml +0 -132
- egse/powermeter/thorlabs/pm100a_cs.py +0 -136
- egse/powermeter/thorlabs/pm100a_devif.py +0 -127
- egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
- egse/powermeter/thorlabs/pm100a_ui.py +0 -725
- egse/process.py +0 -451
- egse/procman/__init__.py +0 -834
- egse/procman/cannot_start_process_popup.py +0 -43
- egse/procman/procman.yaml +0 -49
- egse/procman/procman_cs.py +0 -201
- egse/procman/procman_ui.py +0 -2081
- egse/protocol.py +0 -605
- egse/proxy.py +0 -531
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -693
- egse/resource.py +0 -333
- egse/rmap.py +0 -406
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -247
- egse/services.yaml +0 -68
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1181
- egse/shutter/__init__.py +0 -0
- egse/shutter/thorlabs/__init__.py +0 -19
- egse/shutter/thorlabs/ksc101.py +0 -205
- egse/shutter/thorlabs/ksc101.yaml +0 -105
- egse/shutter/thorlabs/ksc101_cs.py +0 -136
- egse/shutter/thorlabs/ksc101_devif.py +0 -201
- egse/shutter/thorlabs/ksc101_protocol.py +0 -71
- egse/shutter/thorlabs/ksc101_ui.py +0 -548
- egse/shutter/thorlabs/sc10.py +0 -82
- egse/shutter/thorlabs/sc10.yaml +0 -52
- egse/shutter/thorlabs/sc10_controller.py +0 -81
- egse/shutter/thorlabs/sc10_cs.py +0 -108
- egse/shutter/thorlabs/sc10_interface.py +0 -25
- egse/shutter/thorlabs/sc10_simulator.py +0 -30
- egse/simulator.py +0 -41
- egse/slack.py +0 -61
- egse/socketdevice.py +0 -218
- egse/sockets.py +0 -218
- egse/spw.py +0 -1401
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -245
- egse/stages/aerotech/ensemble.yaml +0 -205
- egse/stages/aerotech/ensemble_controller.py +0 -275
- egse/stages/aerotech/ensemble_cs.py +0 -110
- egse/stages/aerotech/ensemble_interface.py +0 -132
- egse/stages/aerotech/ensemble_parameters.py +0 -433
- egse/stages/aerotech/ensemble_simulator.py +0 -27
- egse/stages/aerotech/mgse_sim.py +0 -188
- egse/stages/arun/smd3.py +0 -110
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -470
- egse/stages/arun/smd3_cs.py +0 -112
- egse/stages/arun/smd3_interface.py +0 -53
- egse/stages/arun/smd3_simulator.py +0 -27
- egse/stages/arun/smd3_stop.py +0 -16
- egse/stages/huber/__init__.py +0 -49
- egse/stages/huber/smc9300.py +0 -920
- egse/stages/huber/smc9300.yaml +0 -63
- egse/stages/huber/smc9300_cs.py +0 -178
- egse/stages/huber/smc9300_devif.py +0 -345
- egse/stages/huber/smc9300_protocol.py +0 -113
- egse/stages/huber/smc9300_sim.py +0 -547
- egse/stages/huber/smc9300_ui.py +0 -973
- egse/state.py +0 -173
- egse/statemachine.py +0 -274
- egse/storage/__init__.py +0 -1067
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -79
- egse/storage/storage_cs.py +0 -231
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -417
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1611
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -879
- egse/tcs/tcs.yaml +0 -14
- egse/tcs/tcs_cs.py +0 -202
- egse/tcs/tcs_devif.py +0 -292
- egse/tcs/tcs_protocol.py +0 -180
- egse/tcs/tcs_sim.py +0 -177
- egse/tcs/tcs_ui.py +0 -543
- egse/tdms.py +0 -171
- egse/tempcontrol/__init__.py +0 -23
- egse/tempcontrol/agilent/agilent34970.py +0 -109
- egse/tempcontrol/agilent/agilent34970.yaml +0 -44
- egse/tempcontrol/agilent/agilent34970_cs.py +0 -114
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -96
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -115
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -98
- egse/tempcontrol/beaglebone/beaglebone.py +0 -341
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -134
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -674
- egse/tempcontrol/digalox/digalox.py +0 -115
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -108
- egse/tempcontrol/digalox/digalox_protocol.py +0 -56
- egse/tempcontrol/keithley/__init__.py +0 -33
- egse/tempcontrol/keithley/daq6510.py +0 -662
- egse/tempcontrol/keithley/daq6510.yaml +0 -105
- egse/tempcontrol/keithley/daq6510_cs.py +0 -163
- egse/tempcontrol/keithley/daq6510_devif.py +0 -343
- egse/tempcontrol/keithley/daq6510_protocol.py +0 -79
- egse/tempcontrol/keithley/daq6510_sim.py +0 -186
- egse/tempcontrol/lakeshore/__init__.py +0 -33
- egse/tempcontrol/lakeshore/lsci.py +0 -361
- egse/tempcontrol/lakeshore/lsci.yaml +0 -162
- egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
- egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
- egse/tempcontrol/lakeshore/lsci_protocol.py +0 -76
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -387
- egse/tempcontrol/ni/__init__.py +0 -0
- egse/tempcontrol/spid/spid.py +0 -109
- egse/tempcontrol/spid/spid.yaml +0 -81
- egse/tempcontrol/spid/spid_controller.py +0 -279
- egse/tempcontrol/spid/spid_cs.py +0 -136
- egse/tempcontrol/spid/spid_protocol.py +0 -107
- egse/tempcontrol/spid/spid_ui.py +0 -723
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -867
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -116
- egse/tempcontrol/srs/ptc10_protocol.py +0 -39
- egse/tempcontrol/srs/ptc10_ui.py +0 -906
- egse/ups/apc/apc.py +0 -236
- egse/ups/apc/apc.yaml +0 -45
- egse/ups/apc/apc_cs.py +0 -101
- egse/ups/apc/apc_protocol.py +0 -125
- egse/user.yaml +0 -7
- egse/vacuum/beaglebone/beaglebone.py +0 -149
- egse/vacuum/beaglebone/beaglebone.yaml +0 -44
- egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
- egse/vacuum/beaglebone/beaglebone_devif.py +0 -159
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -192
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -91
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -124
- egse/vacuum/instrutech/igm402_cs.py +0 -108
- egse/vacuum/instrutech/igm402_interface.py +0 -49
- egse/vacuum/instrutech/igm402_simulator.py +0 -36
- egse/vacuum/keller/kellerBus.py +0 -256
- egse/vacuum/keller/leo3.py +0 -100
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -81
- egse/vacuum/keller/leo3_cs.py +0 -101
- egse/vacuum/keller/leo3_interface.py +0 -33
- egse/vacuum/mks/evision.py +0 -86
- egse/vacuum/mks/evision.yaml +0 -75
- egse/vacuum/mks/evision_cs.py +0 -101
- egse/vacuum/mks/evision_devif.py +0 -313
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -701
- egse/vacuum/pfeiffer/acp40.py +0 -87
- egse/vacuum/pfeiffer/acp40.yaml +0 -60
- egse/vacuum/pfeiffer/acp40_controller.py +0 -117
- egse/vacuum/pfeiffer/acp40_cs.py +0 -109
- egse/vacuum/pfeiffer/acp40_interface.py +0 -40
- egse/vacuum/pfeiffer/acp40_simulator.py +0 -37
- egse/vacuum/pfeiffer/tc400.py +0 -87
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -136
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -35
- egse/vacuum/pfeiffer/tpg261.py +0 -80
- egse/vacuum/pfeiffer/tpg261.yaml +0 -66
- egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
- egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
- egse/vacuum/pfeiffer/tpg261_interface.py +0 -59
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -23
- egse/version.py +0 -174
- egse/visitedpositions.py +0 -398
- egse/windowing.py +0 -213
- egse/zmq/__init__.py +0 -28
- egse/zmq/spw.py +0 -160
- egse/zmq_ser.py +0 -41
- scripts/alerts/cold.yaml +0 -278
- scripts/alerts/example_alerts.yaml +0 -54
- scripts/alerts/transition.yaml +0 -14
- scripts/alerts/warm.yaml +0 -49
- scripts/analyse_n_fee_hk_data.py +0 -52
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/check_tcs_calib_coef.py +0 -90
- scripts/correct_ccd_cold_temperature_cal.py +0 -157
- scripts/create_hdf5_report.py +0 -293
- scripts/csl_model.py +0 -420
- scripts/csl_restore_setup.py +0 -229
- scripts/export-grafana-dashboards.py +0 -49
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -54
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -10
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -61
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -59
- scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
- scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
- scripts/fix_csv.py +0 -80
- scripts/ias/correct_ccd_temp_cal_elfique.py +0 -43
- scripts/ias/correct_ccd_temp_cal_floreffe.py +0 -43
- scripts/ias/correct_trp_swap_achel.py +0 -199
- scripts/inta/correct_ccd_temp_cal_duvel.py +0 -43
- scripts/inta/correct_ccd_temp_cal_gueuze.py +0 -43
- scripts/n_fee_supply_voltage_calculation.py +0 -92
- scripts/playground.py +0 -30
- scripts/print_hdf5_hk_data.py +0 -68
- scripts/print_register_map.py +0 -43
- scripts/remove_lines_between_matches.py +0 -188
- scripts/sron/commanding/control_heaters.py +0 -44
- scripts/sron/commanding/pumpdown.py +0 -46
- scripts/sron/commanding/set_pid_setpoint.py +0 -19
- scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
- scripts/sron/commanding/shutdown_pumps.py +0 -33
- scripts/sron/correct_mgse_coordinates_brigand_chimay.py +0 -272
- scripts/sron/correct_trp_swap_brigand.py +0 -204
- scripts/sron/gimbal_conversions.py +0 -75
- scripts/sron/tm_gen/tm_gen_agilent.py +0 -37
- scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
- scripts/sron/tm_gen/tm_gen_spid.py +0 -13
- scripts/update_operational_cgse.py +0 -268
- scripts/update_operational_cgse_old.py +0 -273
egse/procman/__init__.py
DELETED
|
@@ -1,834 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module provides Process Management functionality for the Common-EGSE.
|
|
3
|
-
"""
|
|
4
|
-
import importlib
|
|
5
|
-
import logging
|
|
6
|
-
import pickle
|
|
7
|
-
import time
|
|
8
|
-
|
|
9
|
-
import sys
|
|
10
|
-
import zmq
|
|
11
|
-
|
|
12
|
-
from egse.command import ClientServerCommand
|
|
13
|
-
from egse.confman import ConfigurationManagerProxy
|
|
14
|
-
from egse.control import ControlServer, Success, Failure
|
|
15
|
-
from egse.decorators import dynamic_interface
|
|
16
|
-
from egse.dpu import fitsgen
|
|
17
|
-
from egse.dpu.dpu_cs import is_dpu_cs_active
|
|
18
|
-
from egse.fee import n_fee_hk
|
|
19
|
-
from egse.fov import fov_hk
|
|
20
|
-
from egse.process import SubProcess
|
|
21
|
-
from egse.protocol import CommandProtocol
|
|
22
|
-
from egse.proxy import Proxy
|
|
23
|
-
from egse.settings import Settings
|
|
24
|
-
from egse.setup import Setup, load_setup
|
|
25
|
-
from egse.storage import is_storage_manager_active
|
|
26
|
-
from egse.system import find_class
|
|
27
|
-
from egse.system import format_datetime
|
|
28
|
-
from egse.zmq_ser import bind_address
|
|
29
|
-
from egse.zmq_ser import connect_address
|
|
30
|
-
|
|
31
|
-
CTRL_SETTINGS = Settings.load("Process Manager Control Server")
|
|
32
|
-
COMMAND_SETTINGS = Settings.load(filename="procman.yaml")
|
|
33
|
-
|
|
34
|
-
LOGGER = logging.getLogger(__name__)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def is_process_manager_cs_active(timeout: float = 0.5):
|
|
38
|
-
"""Checks if the Process Manager Control Server is active.
|
|
39
|
-
|
|
40
|
-
To check whether the Control Server is active, a "Ping" command is sent.
|
|
41
|
-
If a "Pong" reply is received before timeout, the Control Server is said
|
|
42
|
-
to be active (and True will be returned). If no reply is received before
|
|
43
|
-
timeout or if the reply is not "Pong", the Control Server is said to be
|
|
44
|
-
inactive (and False will be returned).
|
|
45
|
-
|
|
46
|
-
Args:
|
|
47
|
-
- timeout (float): Timeout when waiting for a reply [s].
|
|
48
|
-
|
|
49
|
-
Returns:
|
|
50
|
-
True if the Process Manager Control Server is active; False otherwise.
|
|
51
|
-
"""
|
|
52
|
-
|
|
53
|
-
# Create a socket and connect it to the commanding port of the CS
|
|
54
|
-
|
|
55
|
-
socket = zmq.Context.instance().socket(zmq.REQ)
|
|
56
|
-
endpoint = connect_address(
|
|
57
|
-
CTRL_SETTINGS.PROTOCOL, CTRL_SETTINGS.HOSTNAME, CTRL_SETTINGS.COMMANDING_PORT
|
|
58
|
-
)
|
|
59
|
-
socket.connect(endpoint)
|
|
60
|
-
|
|
61
|
-
# Send a "Ping" command and wait for a reply
|
|
62
|
-
# (but not beyond timeout)
|
|
63
|
-
|
|
64
|
-
data = pickle.dumps("Ping")
|
|
65
|
-
socket.send(data)
|
|
66
|
-
rlist, _, _ = zmq.select([socket], [], [], timeout=timeout)
|
|
67
|
-
|
|
68
|
-
# Reply received before timeout
|
|
69
|
-
# (should be "Pong")
|
|
70
|
-
|
|
71
|
-
status = False
|
|
72
|
-
|
|
73
|
-
if socket in rlist:
|
|
74
|
-
|
|
75
|
-
# Only if the reply is "Pong", the CS is active
|
|
76
|
-
|
|
77
|
-
data = socket.recv()
|
|
78
|
-
response = pickle.loads(data)
|
|
79
|
-
|
|
80
|
-
status = response == "Pong"
|
|
81
|
-
|
|
82
|
-
# No reply received -> inactive
|
|
83
|
-
|
|
84
|
-
socket.close(linger=0)
|
|
85
|
-
|
|
86
|
-
return status
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
class ProcessManagerProtocol(CommandProtocol):
|
|
90
|
-
|
|
91
|
-
"""
|
|
92
|
-
Command Protocol for Process Management.
|
|
93
|
-
"""
|
|
94
|
-
|
|
95
|
-
def __init__(self, control_server: ControlServer):
|
|
96
|
-
"""Initialisation of a new Protocol for Process Management.
|
|
97
|
-
|
|
98
|
-
The initialisation of this Protocol consists of the following steps:
|
|
99
|
-
|
|
100
|
-
- create a Controller to which the given Control Server should send commands;
|
|
101
|
-
- load the commands;
|
|
102
|
-
- build a look-up table for the commands.
|
|
103
|
-
|
|
104
|
-
Args:
|
|
105
|
-
- control_server: Control Server via which commands should be sent
|
|
106
|
-
to the Controller.
|
|
107
|
-
"""
|
|
108
|
-
|
|
109
|
-
super().__init__()
|
|
110
|
-
|
|
111
|
-
# Control Server for Process Management
|
|
112
|
-
|
|
113
|
-
self.control_server = control_server
|
|
114
|
-
|
|
115
|
-
# Create a new Controller for Process Management
|
|
116
|
-
|
|
117
|
-
self.controller = ProcessManagerController()
|
|
118
|
-
|
|
119
|
-
# Load the commands (for commanding of the PM Controller) from the
|
|
120
|
-
# YAML file into a dictionary, stored in the PM Protocol
|
|
121
|
-
|
|
122
|
-
self.load_commands(
|
|
123
|
-
COMMAND_SETTINGS.Commands, ProcessManagerCommand, ProcessManagerController
|
|
124
|
-
)
|
|
125
|
-
|
|
126
|
-
# Build a look-up table for the methods
|
|
127
|
-
|
|
128
|
-
self.build_device_method_lookup_table(self.controller)
|
|
129
|
-
|
|
130
|
-
def get_bind_address(self):
|
|
131
|
-
"""Returns the address to bind a socket to.
|
|
132
|
-
|
|
133
|
-
This bind address is a properly formatted URL, based on the
|
|
134
|
-
communication protocol and the commanding port.
|
|
135
|
-
|
|
136
|
-
Returns:
|
|
137
|
-
- Properly formatted URL to bind a socket to.
|
|
138
|
-
"""
|
|
139
|
-
|
|
140
|
-
return bind_address(
|
|
141
|
-
self.control_server.get_communication_protocol(),
|
|
142
|
-
self.control_server.get_commanding_port(),
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
def get_status(self) -> dict:
|
|
146
|
-
"""Returns the status information for the Control Server.
|
|
147
|
-
|
|
148
|
-
This status information is returned in the form of a dictionary that
|
|
149
|
-
contains the following information about the Control Server for
|
|
150
|
-
Process Management:
|
|
151
|
-
|
|
152
|
-
- timestamp (str): string representation of the current datetime;
|
|
153
|
-
- PID (int): process ID for the Control Server;
|
|
154
|
-
- Up (float): uptime of the Control Server [s];
|
|
155
|
-
- UUID (uuid1): Universally Unique Identifier for the Control
|
|
156
|
-
Server;
|
|
157
|
-
- RSS (int): 'Resident Set Size', this is the non-swapped physical
|
|
158
|
-
memory a process has used [byte];
|
|
159
|
-
- USS (int): 'Unique Set Size', this is the memory which is unique
|
|
160
|
-
to a process [byte];
|
|
161
|
-
- CPU User (float): time spent in user mode [s];
|
|
162
|
-
- CPU System (float): time spent in kernel mode [s];
|
|
163
|
-
- CPU count: number of CPU cores in use by the process;
|
|
164
|
-
- CPU% (float): process CPU utilization as a percentage [%].
|
|
165
|
-
|
|
166
|
-
Returns:
|
|
167
|
-
- Dictionary with status information for the Control Server for
|
|
168
|
-
Process Management.
|
|
169
|
-
"""
|
|
170
|
-
|
|
171
|
-
return super().get_status()
|
|
172
|
-
|
|
173
|
-
def get_housekeeping(self) -> dict:
|
|
174
|
-
"""Returns the housekeeping data for the Control Server.
|
|
175
|
-
|
|
176
|
-
This housekeeping data is returns in the form of a dictionary that
|
|
177
|
-
contains the following information about the Control Server for
|
|
178
|
-
Process Management:
|
|
179
|
-
|
|
180
|
-
- timestamp (str): string representation of the current datetime.
|
|
181
|
-
|
|
182
|
-
Returns:
|
|
183
|
-
- Dictionary with housekeeping data for the Control Server for
|
|
184
|
-
Process Management.
|
|
185
|
-
"""
|
|
186
|
-
|
|
187
|
-
return {"timestamp": format_datetime()}
|
|
188
|
-
|
|
189
|
-
def quit(self):
|
|
190
|
-
self.controller.quit()
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
class ProcessManagerCommand(ClientServerCommand):
|
|
194
|
-
|
|
195
|
-
"""
|
|
196
|
-
Command (client-server) for Process Management.
|
|
197
|
-
"""
|
|
198
|
-
|
|
199
|
-
pass
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
class ProcessManagerInterface:
|
|
203
|
-
|
|
204
|
-
"""
|
|
205
|
-
Interface for dynamic loading of the commands for Process Management.
|
|
206
|
-
"""
|
|
207
|
-
|
|
208
|
-
@dynamic_interface
|
|
209
|
-
def get_cm_proxy(self):
|
|
210
|
-
"""
|
|
211
|
-
Returns the Proxy for Configuration Management.
|
|
212
|
-
|
|
213
|
-
Returns:
|
|
214
|
-
- Proxy for Configuration Management.
|
|
215
|
-
"""
|
|
216
|
-
|
|
217
|
-
raise NotImplementedError
|
|
218
|
-
|
|
219
|
-
@dynamic_interface
|
|
220
|
-
def start_cs(self, process_name, sim_mode):
|
|
221
|
-
"""Start the device Control Server with the given process name.
|
|
222
|
-
|
|
223
|
-
This method can only be used to start the Control Server of a device
|
|
224
|
-
that is included in the current setup. Core processes (Storage,
|
|
225
|
-
Configuration Manager, and Process Manager) cannot be started with
|
|
226
|
-
this method.
|
|
227
|
-
|
|
228
|
-
The Control Server can either be started in simulator mode (without
|
|
229
|
-
H/W controller available) or in operational mode (with H/W controller
|
|
230
|
-
available).
|
|
231
|
-
|
|
232
|
-
The given process name is the one that is used as device name in the
|
|
233
|
-
setup file and can also be found in the dictionary returned by the
|
|
234
|
-
get_devices() method.
|
|
235
|
-
|
|
236
|
-
Args:
|
|
237
|
-
- process_name: Device name for which the Control Server should be
|
|
238
|
-
started.
|
|
239
|
-
- sim_mode: Whether or not to start the Control Server in
|
|
240
|
-
simulator mode.
|
|
241
|
-
"""
|
|
242
|
-
|
|
243
|
-
raise NotImplementedError
|
|
244
|
-
|
|
245
|
-
@dynamic_interface
|
|
246
|
-
def start_egse(self):
|
|
247
|
-
"""Start all device Control Servers in the current setup in operational mode.
|
|
248
|
-
|
|
249
|
-
This method can only be used to start the Control Servers of the
|
|
250
|
-
devices that are included in the current setup. Core processes
|
|
251
|
-
(Storage, Configuration Manager, and Process Manager) cannot be
|
|
252
|
-
started with this method.
|
|
253
|
-
"""
|
|
254
|
-
|
|
255
|
-
raise NotImplementedError
|
|
256
|
-
|
|
257
|
-
@dynamic_interface
|
|
258
|
-
def shut_down_egse(self, process_name):
|
|
259
|
-
"""Shut down the device Control Server with the given process name.
|
|
260
|
-
|
|
261
|
-
This method can only be used to shut down the Control Server of a
|
|
262
|
-
device that is included in the current setup. Core processes (Storage,
|
|
263
|
-
Configuration Manager, and Process Manager) cannot be shut down with
|
|
264
|
-
this method.
|
|
265
|
-
|
|
266
|
-
The given process name is the one that is used as device name in the
|
|
267
|
-
setup file and can also be found in the dictionary returned by the
|
|
268
|
-
get_devices() method.
|
|
269
|
-
|
|
270
|
-
Args:
|
|
271
|
-
- process_name: Device name for which the Control Server should be
|
|
272
|
-
shut down.
|
|
273
|
-
"""
|
|
274
|
-
|
|
275
|
-
@dynamic_interface
|
|
276
|
-
def shut_down_egse(self):
|
|
277
|
-
"""Shut down all device Control Servers in the current setup.
|
|
278
|
-
|
|
279
|
-
This method can only be used to shut down the Control Servers of the
|
|
280
|
-
devices that are included in the current setup. Core processes
|
|
281
|
-
(Storage, Configuration Manager, and Process Manager) cannot be shut
|
|
282
|
-
down with this method.
|
|
283
|
-
"""
|
|
284
|
-
|
|
285
|
-
raise NotImplementedError
|
|
286
|
-
|
|
287
|
-
@dynamic_interface
|
|
288
|
-
def start_fitsgen(self):
|
|
289
|
-
""" Start the FITS generation."""
|
|
290
|
-
|
|
291
|
-
raise NotImplementedError
|
|
292
|
-
|
|
293
|
-
@dynamic_interface
|
|
294
|
-
def stop_fitsgen(self):
|
|
295
|
-
""" Stop the FITS generation."""
|
|
296
|
-
|
|
297
|
-
raise NotImplementedError
|
|
298
|
-
|
|
299
|
-
@dynamic_interface
|
|
300
|
-
def start_fov_hk(self):
|
|
301
|
-
""" Start the generation of FOV HK."""
|
|
302
|
-
|
|
303
|
-
raise NotImplementedError
|
|
304
|
-
|
|
305
|
-
@dynamic_interface
|
|
306
|
-
def stop_fov_hk(self):
|
|
307
|
-
""" Stop the generation of FOV HK."""
|
|
308
|
-
|
|
309
|
-
raise NotImplementedError
|
|
310
|
-
|
|
311
|
-
@dynamic_interface
|
|
312
|
-
def start_n_fee_hk(self):
|
|
313
|
-
""" Start the generation of N-FEE HK."""
|
|
314
|
-
|
|
315
|
-
raise NotImplementedError
|
|
316
|
-
|
|
317
|
-
@dynamic_interface
|
|
318
|
-
def stop_n_fee_hk(self):
|
|
319
|
-
""" Stop the generation of N-FEE HK."""
|
|
320
|
-
|
|
321
|
-
raise NotImplementedError
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
class ProcessManagerController(ProcessManagerInterface):
|
|
325
|
-
|
|
326
|
-
"""
|
|
327
|
-
Controller for Process Management.
|
|
328
|
-
"""
|
|
329
|
-
|
|
330
|
-
def __init__(self):
|
|
331
|
-
"""Initialisation for the Process Manager Controller.
|
|
332
|
-
|
|
333
|
-
Bother the Configuration Manager and the Storage manager should be running.
|
|
334
|
-
"""
|
|
335
|
-
|
|
336
|
-
# Keep track of the Configuration Manager
|
|
337
|
-
|
|
338
|
-
self._configuration = ConfigurationManagerProxy()
|
|
339
|
-
|
|
340
|
-
# Storage Manager must be active
|
|
341
|
-
|
|
342
|
-
if not is_storage_manager_active():
|
|
343
|
-
|
|
344
|
-
LOGGER.error("No Storage Manager available!!!!")
|
|
345
|
-
|
|
346
|
-
def quit(self):
|
|
347
|
-
|
|
348
|
-
self._configuration.disconnect_cs()
|
|
349
|
-
|
|
350
|
-
def get_cm_proxy(self):
|
|
351
|
-
"""
|
|
352
|
-
Returns the Proxy for Configuration Management.
|
|
353
|
-
|
|
354
|
-
Returns:
|
|
355
|
-
- Proxy for Configuration Management.
|
|
356
|
-
"""
|
|
357
|
-
|
|
358
|
-
if not self._configuration.has_commands():
|
|
359
|
-
self._configuration.load_commands()
|
|
360
|
-
|
|
361
|
-
return self._configuration
|
|
362
|
-
|
|
363
|
-
def get_devices(self):
|
|
364
|
-
"""Returns a dictionary with the device processes.
|
|
365
|
-
|
|
366
|
-
The devices processes that are listed in this dictionary are the ones
|
|
367
|
-
that are included in the current setup.
|
|
368
|
-
|
|
369
|
-
The keys in the dictionary are taken from the "device_name" entries in
|
|
370
|
-
the setup file. The corresponding values in the dictionary are taken
|
|
371
|
-
from the "device" entries in the setup file (and should be Proxy classes).
|
|
372
|
-
|
|
373
|
-
Returns:
|
|
374
|
-
- Dictionary with the devices that are included in the setup.
|
|
375
|
-
"""
|
|
376
|
-
|
|
377
|
-
try:
|
|
378
|
-
|
|
379
|
-
setup = load_setup()
|
|
380
|
-
|
|
381
|
-
devices = {}
|
|
382
|
-
devices = Setup.find_devices(setup, devices=devices)
|
|
383
|
-
|
|
384
|
-
return devices
|
|
385
|
-
|
|
386
|
-
except AttributeError:
|
|
387
|
-
|
|
388
|
-
return {}
|
|
389
|
-
|
|
390
|
-
def get_core(self):
|
|
391
|
-
"""Returns a dictionary with the core EGSE processes.
|
|
392
|
-
|
|
393
|
-
The core EGSE processes are:
|
|
394
|
-
|
|
395
|
-
- the Storage Manager,
|
|
396
|
-
- the Configuration Manager,
|
|
397
|
-
- the Process Manager,
|
|
398
|
-
- and the Synoptics Manager.
|
|
399
|
-
|
|
400
|
-
These processes should be running at all times, and can neither be
|
|
401
|
-
started nor shut down from within the Process Manager.
|
|
402
|
-
|
|
403
|
-
The keys in the dictionary are the names of the core processes. The
|
|
404
|
-
values are the Proxy classes.
|
|
405
|
-
|
|
406
|
-
Returns:
|
|
407
|
-
- Dictionary with the core EGSE processes.
|
|
408
|
-
|
|
409
|
-
"""
|
|
410
|
-
|
|
411
|
-
storage_proxy_class = "class//egse.storage.StorageProxy"
|
|
412
|
-
confman_proxy_class = "class//egse.confman.ConfigurationManagerProxy"
|
|
413
|
-
procman_proxy_class = "class//egse.procman.ProcessManagerProxy"
|
|
414
|
-
syn_proxy_class = "class//egse.synoptics.SynopticsManagerProxy"
|
|
415
|
-
|
|
416
|
-
return {
|
|
417
|
-
"Storage": (storage_proxy_class, ()),
|
|
418
|
-
"Configuration Manager": (confman_proxy_class, ()),
|
|
419
|
-
"Process Manager": (procman_proxy_class, ()),
|
|
420
|
-
"Synoptics Manager": (syn_proxy_class, ()),
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
def start_egse(self):
|
|
424
|
-
"""Start all device Control Servers in the current setup in operational mode.
|
|
425
|
-
|
|
426
|
-
This method can only be used to start the Control Servers of the
|
|
427
|
-
devices that are included in the current setup. Core processes
|
|
428
|
-
(Storage, Configuration Manager, and Process Manager) cannot be
|
|
429
|
-
started with this method.
|
|
430
|
-
"""
|
|
431
|
-
|
|
432
|
-
LOGGER.debug("Starting EGSE")
|
|
433
|
-
|
|
434
|
-
devices = self.get_devices()
|
|
435
|
-
|
|
436
|
-
for process_name, process_info in devices.items():
|
|
437
|
-
|
|
438
|
-
proxy_type = process_info[0]
|
|
439
|
-
device_args = process_info[1]
|
|
440
|
-
|
|
441
|
-
try:
|
|
442
|
-
|
|
443
|
-
with find_class(proxy_type)(*device_args):
|
|
444
|
-
|
|
445
|
-
# The CS is already running
|
|
446
|
-
|
|
447
|
-
LOGGER.info(f"{process_name} was already running")
|
|
448
|
-
|
|
449
|
-
except ConnectionError:
|
|
450
|
-
|
|
451
|
-
try:
|
|
452
|
-
|
|
453
|
-
module_name = proxy_type[7:].rsplit(".", 1)[0]
|
|
454
|
-
module = importlib.import_module(module_name)
|
|
455
|
-
|
|
456
|
-
cs_type = module.DEVICE_SETTINGS.ControlServer
|
|
457
|
-
|
|
458
|
-
# Operational mode
|
|
459
|
-
|
|
460
|
-
if str.startswith(proxy_type, "class//egse.aeu.aeu.CRIO"):
|
|
461
|
-
|
|
462
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start-crio-cs"])
|
|
463
|
-
|
|
464
|
-
elif str.startswith(proxy_type, "class//egse.aeu.aeu.PSU"):
|
|
465
|
-
|
|
466
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start-psu-cs", str(device_args[0])])
|
|
467
|
-
|
|
468
|
-
elif str.startswith(proxy_type, "class//egse.aeu.aeu.AWG"):
|
|
469
|
-
|
|
470
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start-awg-cs", str(device_args[0])])
|
|
471
|
-
|
|
472
|
-
else:
|
|
473
|
-
if len(device_args) == 0:
|
|
474
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start"])
|
|
475
|
-
else:
|
|
476
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start", str(device_args[0])])
|
|
477
|
-
|
|
478
|
-
LOGGER.info(f"Starting Control Server for {process_name} in operational mode")
|
|
479
|
-
cs.execute(detach_from_parent=True)
|
|
480
|
-
|
|
481
|
-
if process_name == "DAQ6510":
|
|
482
|
-
setup = load_setup()
|
|
483
|
-
das_delay = setup.gse.DAQ6510.route.delay
|
|
484
|
-
das_count = setup.gse.DAQ6510.route.scan.COUNT.SCAN
|
|
485
|
-
das_interval = setup.gse.DAQ6510.route.scan.INTERVAL
|
|
486
|
-
|
|
487
|
-
das = SubProcess("MyApp", [sys.executable, "-m", "egse.das", "daq6510", "--count",
|
|
488
|
-
str(das_count), "--interval", str(das_interval), "--delay",
|
|
489
|
-
str(das_delay)])
|
|
490
|
-
das.execute(detach_from_parent="True")
|
|
491
|
-
|
|
492
|
-
elif process_name == "PTC10":
|
|
493
|
-
das = SubProcess("MyApp", [sys.executable, "-m", "egse.das", "ptc10", "--auto_regulation"])
|
|
494
|
-
das.execute(detach_from_parent="True")
|
|
495
|
-
|
|
496
|
-
elif process_name == "CDAQ OGSE2":
|
|
497
|
-
das = SubProcess("MyApp", [sys.executable, "-m", "egse.das", "cdaq-photo"])
|
|
498
|
-
das.execute(detach_from_parent="True")
|
|
499
|
-
|
|
500
|
-
elif process_name == "CDAQ ALARMS": # TODO
|
|
501
|
-
das = SubProcess("MyApp", [sys.executable, "-m", "egse.das", "cdaq-alarms"])
|
|
502
|
-
das.execute(detach_from_parent="True")
|
|
503
|
-
|
|
504
|
-
# Check to see the CS actually started
|
|
505
|
-
|
|
506
|
-
time.sleep(5)
|
|
507
|
-
try:
|
|
508
|
-
with find_class(proxy_type)(*device_args):
|
|
509
|
-
pass
|
|
510
|
-
except ConnectionError:
|
|
511
|
-
LOGGER.warning(f"Could not start Control Server for {process_name}")
|
|
512
|
-
|
|
513
|
-
except AttributeError:
|
|
514
|
-
|
|
515
|
-
LOGGER.debug(f"Cannot start Control Server for {process_name}")
|
|
516
|
-
|
|
517
|
-
LOGGER.debug("EGSE started")
|
|
518
|
-
|
|
519
|
-
def start_cs(self, process_name, sim_mode):
|
|
520
|
-
"""Start the device Control Server with the given process name.
|
|
521
|
-
|
|
522
|
-
This method can only be used to start the Control Server of a device
|
|
523
|
-
that is included in the current setup. Core processes (Storage,
|
|
524
|
-
Configuration Manager, and Process Manager) cannot be started with
|
|
525
|
-
this method.
|
|
526
|
-
|
|
527
|
-
The Control Server can either be started in simulator mode (without
|
|
528
|
-
H/W controller available) or in operational mode (with H/W controller
|
|
529
|
-
available).
|
|
530
|
-
|
|
531
|
-
The given process name is the one that is used as device name in the
|
|
532
|
-
setup file and can also be found in the dictionary returned by the
|
|
533
|
-
get_devices() method.
|
|
534
|
-
|
|
535
|
-
Args:
|
|
536
|
-
- process_name: Device name for which the Control Server should be
|
|
537
|
-
started.
|
|
538
|
-
- sim_mode: Whether or not to start the Control Server in
|
|
539
|
-
simulator mode.
|
|
540
|
-
"""
|
|
541
|
-
|
|
542
|
-
LOGGER.debug(f"Starting {process_name}")
|
|
543
|
-
|
|
544
|
-
process_info = self.get_devices()[process_name]
|
|
545
|
-
proxy_type = process_info[0]
|
|
546
|
-
device_args = process_info[1]
|
|
547
|
-
|
|
548
|
-
try:
|
|
549
|
-
|
|
550
|
-
with find_class(proxy_type)(*device_args):
|
|
551
|
-
|
|
552
|
-
# The CS is already running
|
|
553
|
-
|
|
554
|
-
message = f"{process_name} was already running"
|
|
555
|
-
LOGGER.info(message)
|
|
556
|
-
return Success(message)
|
|
557
|
-
|
|
558
|
-
except ConnectionError:
|
|
559
|
-
|
|
560
|
-
try:
|
|
561
|
-
|
|
562
|
-
module_name = proxy_type[7:].rsplit(".", 1)[0]
|
|
563
|
-
module = importlib.import_module(module_name)
|
|
564
|
-
|
|
565
|
-
if hasattr(module, "DEVICE_SETTINGS") and hasattr(module.DEVICE_SETTINGS, "ControlServer"):
|
|
566
|
-
cs_type = module.DEVICE_SETTINGS.ControlServer
|
|
567
|
-
else:
|
|
568
|
-
raise AttributeError(f"DEVICE_SETTINGS (or ControlServer therein) not defined in {module_name}")
|
|
569
|
-
|
|
570
|
-
# Simulator mode
|
|
571
|
-
|
|
572
|
-
if sim_mode:
|
|
573
|
-
|
|
574
|
-
mode = "simulator mode"
|
|
575
|
-
|
|
576
|
-
if str.startswith(proxy_type, "class//egse.aeu.aeu.CRIO"):
|
|
577
|
-
|
|
578
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start-crio-cs", "--sim"])
|
|
579
|
-
|
|
580
|
-
elif str.startswith(proxy_type, "class//egse.aeu.aeu.PSU"):
|
|
581
|
-
|
|
582
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start-psu-cs", str(device_args[0]), "--sim"])
|
|
583
|
-
|
|
584
|
-
elif str.startswith(proxy_type, "class//egse.aeu.aeu.AWG"):
|
|
585
|
-
|
|
586
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start-awg-cs", str(device_args[0]), "--sim"])
|
|
587
|
-
|
|
588
|
-
else:
|
|
589
|
-
|
|
590
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start", "--sim"])
|
|
591
|
-
|
|
592
|
-
# Operational mode
|
|
593
|
-
|
|
594
|
-
else:
|
|
595
|
-
|
|
596
|
-
mode = "operational mode"
|
|
597
|
-
|
|
598
|
-
if str.startswith(proxy_type, "class//egse.aeu.aeu.CRIO"):
|
|
599
|
-
|
|
600
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start-crio-cs"])
|
|
601
|
-
|
|
602
|
-
elif str.startswith(proxy_type, "class//egse.aeu.aeu.PSU"):
|
|
603
|
-
|
|
604
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start-psu-cs", str(device_args[0])])
|
|
605
|
-
|
|
606
|
-
elif str.startswith(proxy_type, "class//egse.aeu.aeu.AWG"):
|
|
607
|
-
|
|
608
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start-awg-cs", str(device_args[0])])
|
|
609
|
-
|
|
610
|
-
else:
|
|
611
|
-
if len(device_args) == 0:
|
|
612
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start"])
|
|
613
|
-
else:
|
|
614
|
-
cs = SubProcess("MyApp", [sys.executable, "-m", cs_type, "start", str(device_args[0])])
|
|
615
|
-
# os.system(sys.executable + " -m " + cs_type + " start")
|
|
616
|
-
|
|
617
|
-
LOGGER.info(f"Starting Control Server for {process_name} in {mode}")
|
|
618
|
-
cs.execute(detach_from_parent=True)
|
|
619
|
-
|
|
620
|
-
if process_name == "DAQ6510":
|
|
621
|
-
das = SubProcess("MyApp", [sys.executable, "-m", "egse.das", "daq6510"])
|
|
622
|
-
das.execute(detach_from_parent="True")
|
|
623
|
-
|
|
624
|
-
elif process_name == "PTC10":
|
|
625
|
-
das = SubProcess("MyApp", [sys.executable, "-m", "egse.das", "ptc10", "--auto_regulation"])
|
|
626
|
-
das.execute(detach_from_parent="True")
|
|
627
|
-
|
|
628
|
-
elif process_name == "CDAQ OGSE2":
|
|
629
|
-
das = SubProcess("MyApp", [sys.executable, "-m", "egse.das", "cdaq-photo"])
|
|
630
|
-
das.execute(detach_from_parent="True")
|
|
631
|
-
|
|
632
|
-
elif process_name == "CDAQ ALARMS": # TODO
|
|
633
|
-
das = SubProcess("MyApp", [sys.executable, "-m", "egse.das", "cdaq-alarms"])
|
|
634
|
-
das.execute(detach_from_parent="True")
|
|
635
|
-
|
|
636
|
-
# Check to see the CS actually started
|
|
637
|
-
|
|
638
|
-
time.sleep(5)
|
|
639
|
-
try:
|
|
640
|
-
with find_class(proxy_type)(*device_args):
|
|
641
|
-
return Success(f"{process_name} successfully started")
|
|
642
|
-
except ConnectionError as exc:
|
|
643
|
-
message = f"Could not start Control Server for {process_name}"
|
|
644
|
-
LOGGER.warning(message, exc_info=True)
|
|
645
|
-
return Failure(message, cause=exc)
|
|
646
|
-
|
|
647
|
-
except AttributeError as exc:
|
|
648
|
-
message = f"Cannot start Control Server for {process_name}"
|
|
649
|
-
LOGGER.error(message, exc_info=True)
|
|
650
|
-
return Failure(message, cause=exc)
|
|
651
|
-
|
|
652
|
-
# with find_class(proxy_type)(*device_args):
|
|
653
|
-
# pass
|
|
654
|
-
|
|
655
|
-
def shut_down_egse(self):
|
|
656
|
-
"""Shut down all device Control Servers in the current setup.
|
|
657
|
-
|
|
658
|
-
This method can only be used to shut down the Control Servers of the
|
|
659
|
-
devices that are included in the current setup. Core processes
|
|
660
|
-
(Storage, Configuration Manager, and Process Manager) cannot be shut
|
|
661
|
-
down with this method.
|
|
662
|
-
"""
|
|
663
|
-
|
|
664
|
-
LOGGER.debug("Shutting down EGSE")
|
|
665
|
-
|
|
666
|
-
devices = self.get_devices()
|
|
667
|
-
|
|
668
|
-
for key, process_info in reversed(devices.items()):
|
|
669
|
-
|
|
670
|
-
LOGGER.debug(f"Shutting down {key}")
|
|
671
|
-
|
|
672
|
-
proxy_type = process_info[0]
|
|
673
|
-
device_args = process_info[1]
|
|
674
|
-
|
|
675
|
-
try:
|
|
676
|
-
|
|
677
|
-
with find_class(proxy_type)(*device_args) as process_proxy:
|
|
678
|
-
|
|
679
|
-
with process_proxy.get_service_proxy() as service_proxy:
|
|
680
|
-
|
|
681
|
-
service_proxy.quit_server()
|
|
682
|
-
|
|
683
|
-
except ConnectionError:
|
|
684
|
-
|
|
685
|
-
pass
|
|
686
|
-
|
|
687
|
-
LOGGER.debug("EGSE shut down")
|
|
688
|
-
|
|
689
|
-
def shut_down_cs(self, process_name):
|
|
690
|
-
"""Shut down the device Control Server with the given process name.
|
|
691
|
-
|
|
692
|
-
This method can only be used to shut down the Control Server of a
|
|
693
|
-
device that is included in the current setup. Core processes (Storage,
|
|
694
|
-
Configuration Manager, and Process Manager) cannot be shut down with
|
|
695
|
-
this method.
|
|
696
|
-
|
|
697
|
-
The given process name is the one that is used as device name in the
|
|
698
|
-
setup file and can also be found in the dictionary returned by the
|
|
699
|
-
get_devices() method.
|
|
700
|
-
|
|
701
|
-
Args:
|
|
702
|
-
- process_name: Device name for which the Control Server should be
|
|
703
|
-
shut down.
|
|
704
|
-
"""
|
|
705
|
-
|
|
706
|
-
LOGGER.debug(f"Shutting down {process_name}")
|
|
707
|
-
|
|
708
|
-
try:
|
|
709
|
-
|
|
710
|
-
process_info = self.get_devices()[process_name]
|
|
711
|
-
proxy_type = process_info[0]
|
|
712
|
-
device_args = process_info[1]
|
|
713
|
-
|
|
714
|
-
with find_class(proxy_type)(*device_args) as process_proxy:
|
|
715
|
-
|
|
716
|
-
with process_proxy.get_service_proxy() as service_proxy:
|
|
717
|
-
|
|
718
|
-
LOGGER.debug("Shutting down CS")
|
|
719
|
-
|
|
720
|
-
service_proxy.quit_server()
|
|
721
|
-
|
|
722
|
-
except ConnectionError:
|
|
723
|
-
|
|
724
|
-
# The CS is already down
|
|
725
|
-
|
|
726
|
-
LOGGER.info(f"{process_name} was already down")
|
|
727
|
-
|
|
728
|
-
def start_fitsgen(self):
|
|
729
|
-
""" Start the FITS generation."""
|
|
730
|
-
|
|
731
|
-
# TODO Think about potential conditions for the FITS generator to be started:
|
|
732
|
-
# - FITS generator should not be running yet
|
|
733
|
-
# - FEE simulator must be running?
|
|
734
|
-
# - DPU CS must be running?
|
|
735
|
-
|
|
736
|
-
# Check whether the DPU CS is running
|
|
737
|
-
|
|
738
|
-
if not is_dpu_cs_active():
|
|
739
|
-
message = "The DPU Control Server must be running to be able to start the FITS generation."
|
|
740
|
-
LOGGER.critical(message)
|
|
741
|
-
return Failure(message)
|
|
742
|
-
|
|
743
|
-
LOGGER.info("Starting the FITS generation")
|
|
744
|
-
|
|
745
|
-
fg = SubProcess("MyApp", [sys.executable, "-m", "egse.dpu.fitsgen", "start"])
|
|
746
|
-
fg.execute(detach_from_parent=True)
|
|
747
|
-
|
|
748
|
-
time.sleep(5)
|
|
749
|
-
if fitsgen.send_request("status").get("status") != "ACK":
|
|
750
|
-
return Failure("FITS generation could not be started for some unknown reason.")
|
|
751
|
-
|
|
752
|
-
return Success("FITS generation successfully started.")
|
|
753
|
-
|
|
754
|
-
def stop_fitsgen(self):
|
|
755
|
-
""" Stop the FITS generation."""
|
|
756
|
-
|
|
757
|
-
LOGGER.info("Stopping the FITS generation")
|
|
758
|
-
|
|
759
|
-
fg = SubProcess("MyApp", [sys.executable, "-m", "egse.dpu.fitsgen", "stop"])
|
|
760
|
-
fg.execute(detach_from_parent=True)
|
|
761
|
-
|
|
762
|
-
def start_fov_hk(self):
|
|
763
|
-
""" Start the generation of FOV HK."""
|
|
764
|
-
|
|
765
|
-
LOGGER.info("Starting the generation of FOV HK")
|
|
766
|
-
|
|
767
|
-
fg = SubProcess("MyApp", [sys.executable, "-m", "egse.fov.fov_hk", "start"])
|
|
768
|
-
fg.execute(detach_from_parent=True)
|
|
769
|
-
|
|
770
|
-
time.sleep(5)
|
|
771
|
-
if fov_hk.send_request("status").get("status") != "ACK":
|
|
772
|
-
return Failure("FOV HK generation could not be started for some unknown reason.")
|
|
773
|
-
|
|
774
|
-
return Success("FOV HK generation successfully started.")
|
|
775
|
-
|
|
776
|
-
def stop_fov_hk(self):
|
|
777
|
-
""" Stop the generation of FOV HK."""
|
|
778
|
-
|
|
779
|
-
LOGGER.info("Stopping the generation of FOV HK")
|
|
780
|
-
|
|
781
|
-
fg = SubProcess("MyApp", [sys.executable, "-m", "egse.fov.fov_hk", "stop"])
|
|
782
|
-
fg.execute(detach_from_parent=True)
|
|
783
|
-
|
|
784
|
-
def start_n_fee_hk(self):
|
|
785
|
-
""" Start the generation of N-FEE HK."""
|
|
786
|
-
|
|
787
|
-
LOGGER.info("Starting the generation of N-FEE HK")
|
|
788
|
-
|
|
789
|
-
fg = SubProcess("MyApp", [sys.executable, "-m", "egse.fee.n_fee_hk", "start"])
|
|
790
|
-
fg.execute(detach_from_parent=True)
|
|
791
|
-
|
|
792
|
-
time.sleep(5)
|
|
793
|
-
if n_fee_hk.send_request("status").get("status") != "ACK":
|
|
794
|
-
return Failure("N-FEE HK generation could not be started for some unknown reason.")
|
|
795
|
-
|
|
796
|
-
return Success("N-FEE HK generation successfully started.")
|
|
797
|
-
|
|
798
|
-
def stop_n_fee_hk(self):
|
|
799
|
-
""" Stop the generation of N-FEE HK."""
|
|
800
|
-
|
|
801
|
-
LOGGER.info("Stopping the generation of N-FEE HK")
|
|
802
|
-
|
|
803
|
-
fg = SubProcess("MyApp", [sys.executable, "-m", "egse.fee.n_fee_hk", "stop"])
|
|
804
|
-
fg.execute(detach_from_parent=True)
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
class ProcessManagerProxy(Proxy, ProcessManagerInterface):
|
|
808
|
-
|
|
809
|
-
"""
|
|
810
|
-
Proxy for Process Managements, used to connect to the Process Manager
|
|
811
|
-
Control Server and send commands remotely.
|
|
812
|
-
"""
|
|
813
|
-
|
|
814
|
-
def __init__(
|
|
815
|
-
self,
|
|
816
|
-
protocol=CTRL_SETTINGS.PROTOCOL,
|
|
817
|
-
hostname=CTRL_SETTINGS.HOSTNAME,
|
|
818
|
-
port=CTRL_SETTINGS.COMMANDING_PORT,
|
|
819
|
-
):
|
|
820
|
-
"""Initialisation of a new Proxy for Process Management.
|
|
821
|
-
|
|
822
|
-
If no connection details (transport protocol, hostname, and port) are
|
|
823
|
-
not provided, these are taken from the settings file.
|
|
824
|
-
|
|
825
|
-
Args:
|
|
826
|
-
- protocol: Transport protocol [default is taken from settings
|
|
827
|
-
file].
|
|
828
|
-
- hostname: Location of the control server (IP address) [default
|
|
829
|
-
is taken from settings file].
|
|
830
|
-
- port: TCP port on which the Control Server is listening for
|
|
831
|
-
commands [default is taken from settings file].
|
|
832
|
-
"""
|
|
833
|
-
|
|
834
|
-
super().__init__(connect_address(protocol, hostname, port))
|