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
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import os
|
|
3
|
-
import subprocess
|
|
4
|
-
from datetime import datetime
|
|
5
|
-
|
|
6
|
-
from egse.fdir import generate_popup
|
|
7
|
-
from egse.fdir.fdir_remote import FdirRemoteProxy
|
|
8
|
-
from egse.fdir.fdir_remote_interface import FdirRemoteInterface
|
|
9
|
-
from egse.settings import Settings
|
|
10
|
-
from egse.setup import load_setup
|
|
11
|
-
from egse.system import replace_environment_variable
|
|
12
|
-
|
|
13
|
-
logger = logging.getLogger(__name__)
|
|
14
|
-
|
|
15
|
-
CTRL_SETTINGS = Settings.load("FDIR Manager Control Server")
|
|
16
|
-
REMOTE_SETTINGS = Settings.load("FDIR Remote Control Server")
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class FdirException(Exception):
|
|
20
|
-
pass
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class FdirManagerController(FdirRemoteInterface):
|
|
24
|
-
|
|
25
|
-
def __init__(self):
|
|
26
|
-
|
|
27
|
-
self._state = ""
|
|
28
|
-
self._priority = -1
|
|
29
|
-
self._storage_path = replace_environment_variable(CTRL_SETTINGS.RECOVERY_SCRIPT_LOCATION)
|
|
30
|
-
self._logging_path = replace_environment_variable(CTRL_SETTINGS.LOGGING_LOCATION)
|
|
31
|
-
self._remote_proxy = FdirRemoteProxy()
|
|
32
|
-
# Check if the remote is online.
|
|
33
|
-
if not self._remote_proxy.is_cs_connected():
|
|
34
|
-
logger.warning("FDIR Manager could not connect to the FDIR remote CS")
|
|
35
|
-
else:
|
|
36
|
-
logger.info(f"connected to remote CS @ {REMOTE_SETTINGS.HOSTNAME}")
|
|
37
|
-
|
|
38
|
-
# Try to load fdir table.
|
|
39
|
-
try:
|
|
40
|
-
setup = load_setup()
|
|
41
|
-
self._fdir_table = setup.gse.fdir_manager.configuration.table
|
|
42
|
-
except AttributeError as ex:
|
|
43
|
-
raise FdirException("Could not FDIR table from current setup") from ex
|
|
44
|
-
|
|
45
|
-
def is_connected(self):
|
|
46
|
-
return True
|
|
47
|
-
|
|
48
|
-
def is_simulator(self):
|
|
49
|
-
return False
|
|
50
|
-
|
|
51
|
-
def signal_fdir(self, fdir_code: str, script_args: list):
|
|
52
|
-
|
|
53
|
-
logger.info(f"Received FDIR code {fdir_code}: {script_args}.")
|
|
54
|
-
|
|
55
|
-
# try to get the mitigation script name and priority from the fdir table
|
|
56
|
-
try:
|
|
57
|
-
recovery_command = self._fdir_table[fdir_code]['script']
|
|
58
|
-
priority = self._fdir_table[fdir_code]['priority']
|
|
59
|
-
actions = self._fdir_table[fdir_code]['actions']
|
|
60
|
-
except:
|
|
61
|
-
logger.error(f"No mitigation script found in the fdir table for fdir code {fdir_code}.")
|
|
62
|
-
raise FdirException("Cannot find code in FDIR table")
|
|
63
|
-
|
|
64
|
-
if priority <= self._priority:
|
|
65
|
-
logger.warning(f"Received FDIR code with lower priority {fdir_code} ({priority}) "
|
|
66
|
-
f"than current state {self._state} ({self._priority}).")
|
|
67
|
-
return
|
|
68
|
-
|
|
69
|
-
self._state = fdir_code
|
|
70
|
-
self._priority = priority
|
|
71
|
-
|
|
72
|
-
# open filewriter for fdir script output logging
|
|
73
|
-
timestring = datetime.now().strftime("%y-%m-%d_%H:%M:%S")
|
|
74
|
-
outfilename = f"{self._logging_path}/log/{timestring}_fdir_{fdir_code}"
|
|
75
|
-
os.makedirs(os.path.dirname(outfilename), exist_ok=True) # Create directories if they don't exist
|
|
76
|
-
|
|
77
|
-
# create list of strings used to call subprocess
|
|
78
|
-
exc_command = ["python3"]
|
|
79
|
-
exc_command.append(recovery_command) # read script path
|
|
80
|
-
exc_command[1] = f"{self._storage_path}{exc_command[1]}" # prepend path to script
|
|
81
|
-
exc_command.extend(script_args) # add script arguments
|
|
82
|
-
|
|
83
|
-
# run recovery script
|
|
84
|
-
script_success = False
|
|
85
|
-
try:
|
|
86
|
-
outfile = open(outfilename, 'w')
|
|
87
|
-
p = subprocess.Popen(exc_command,
|
|
88
|
-
stdout=outfile,
|
|
89
|
-
stderr=outfile,
|
|
90
|
-
shell=False,
|
|
91
|
-
preexec_fn=os.setpgrp)
|
|
92
|
-
p.wait()
|
|
93
|
-
except Exception as e:
|
|
94
|
-
logger.error(f"failed to run {exc_command}: {e}")
|
|
95
|
-
else:
|
|
96
|
-
if p.returncode == 0:
|
|
97
|
-
logger.info(f"Executed recovery script '{recovery_command}'.")
|
|
98
|
-
script_success = True
|
|
99
|
-
else:
|
|
100
|
-
logger.info(f"Failed to execute script: '{recovery_command}'")
|
|
101
|
-
script_success = False
|
|
102
|
-
finally:
|
|
103
|
-
outfile.close()
|
|
104
|
-
|
|
105
|
-
# Create a single string representation of the actions list for the pop-up.
|
|
106
|
-
action_string = "\n".join([f"- {action}" for action in actions])
|
|
107
|
-
|
|
108
|
-
# Generate a pop-up on the remote machine (client).
|
|
109
|
-
if self._remote_proxy.is_cs_connected():
|
|
110
|
-
self._remote_proxy.generate_popup(
|
|
111
|
-
code=fdir_code, actions=action_string, success=script_success)
|
|
112
|
-
else:
|
|
113
|
-
generate_popup(code=fdir_code, actions=action_string, success=script_success)
|
|
114
|
-
|
|
115
|
-
def clear_fdir(self):
|
|
116
|
-
self._priority = 0
|
|
117
|
-
logger.info("Cleared FDIR state.")
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
def get_state(self):
|
|
121
|
-
return self._priority
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
def main():
|
|
125
|
-
fmc = FdirManagerController()
|
|
126
|
-
fmc.register_script('localhost', 11111)
|
|
127
|
-
print("fdir_state =", fmc.get_state())
|
|
128
|
-
fmc.signal_fdir('FDIR_TEST')
|
|
129
|
-
fmc.signal_fdir('FDIR_TEST') # Should fail because of priority
|
|
130
|
-
print("fdir_state =", fmc.get_state())
|
|
131
|
-
fmc.clear_fdir()
|
|
132
|
-
fmc.signal_fdir('FDIR_TEST')
|
|
133
|
-
print("fdir_state =", fmc.get_state())
|
|
134
|
-
|
|
135
|
-
if __name__ == "__main__":
|
|
136
|
-
main()
|
egse/fdir/fdir_manager_cs.py
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import multiprocessing
|
|
3
|
-
import sys
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
import click
|
|
7
|
-
import zmq
|
|
8
|
-
from prometheus_client import start_http_server
|
|
9
|
-
|
|
10
|
-
from egse.settings import Settings
|
|
11
|
-
from egse.control import ControlServer
|
|
12
|
-
from egse.system import replace_environment_variable
|
|
13
|
-
from egse.fdir.fdir_manager import FdirManagerProtocol, FdirManagerProxy
|
|
14
|
-
|
|
15
|
-
logger = logging.getLogger(__name__)
|
|
16
|
-
|
|
17
|
-
CTRL_SETTINGS = Settings.load("FDIR Manager Control Server")
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
class FdirManagerControlServer(ControlServer):
|
|
21
|
-
""" The FDIR Manager Control Server is the centralized point of emergency mitigation.
|
|
22
|
-
In response to an FDIR signal from anywhere in the CGSE, this CS will terminate all running
|
|
23
|
-
control scripts and subsequently run a predefined recovery script. Terminating control
|
|
24
|
-
scripts on other hosts is done through a FDIR Remote CS, running on the other host(s).
|
|
25
|
-
|
|
26
|
-
The following functionality is provided:
|
|
27
|
-
|
|
28
|
-
* (de-)registering control scripts
|
|
29
|
-
* receiving FDIR codes
|
|
30
|
-
* automated killing of operational scripts
|
|
31
|
-
* automated running of recovery scripts
|
|
32
|
-
* handling priority between FDIR codes
|
|
33
|
-
* monitoring of the FDIR CS state
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
def __init__(self):
|
|
37
|
-
super().__init__()
|
|
38
|
-
|
|
39
|
-
self.device_protocol = FdirManagerProtocol(self)
|
|
40
|
-
self.logger.debug(f"Binding ZeroMQ socket to {self.device_protocol.get_bind_address()}")
|
|
41
|
-
self.device_protocol.bind(self.dev_ctrl_cmd_sock)
|
|
42
|
-
self.poller.register(self.dev_ctrl_cmd_sock, zmq.POLLIN)
|
|
43
|
-
|
|
44
|
-
def get_communication_protocol(self):
|
|
45
|
-
return CTRL_SETTINGS.PROTOCOL
|
|
46
|
-
|
|
47
|
-
def get_commanding_port(self):
|
|
48
|
-
return CTRL_SETTINGS.COMMANDING_PORT
|
|
49
|
-
|
|
50
|
-
def get_service_port(self):
|
|
51
|
-
return CTRL_SETTINGS.SERVICE_PORT
|
|
52
|
-
|
|
53
|
-
def get_monitoring_port(self):
|
|
54
|
-
return CTRL_SETTINGS.MONITORING_PORT
|
|
55
|
-
|
|
56
|
-
def get_storage_mnemonic(self):
|
|
57
|
-
try:
|
|
58
|
-
return CTRL_SETTINGS.STORAGE_MNEMONIC
|
|
59
|
-
except AttributeError:
|
|
60
|
-
return "FM"
|
|
61
|
-
|
|
62
|
-
def before_serve(self):
|
|
63
|
-
start_http_server(CTRL_SETTINGS.METRICS_PORT)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
@click.group()
|
|
67
|
-
def cli():
|
|
68
|
-
pass
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
@cli.command()
|
|
72
|
-
def start():
|
|
73
|
-
""" Starts the FDIR Control Server. """
|
|
74
|
-
|
|
75
|
-
multiprocessing.current_process().name = "fdir_manager_cs"
|
|
76
|
-
|
|
77
|
-
try:
|
|
78
|
-
check_prerequisites()
|
|
79
|
-
except RuntimeError as exc:
|
|
80
|
-
print(exc)
|
|
81
|
-
logger.error(exc)
|
|
82
|
-
return 0
|
|
83
|
-
|
|
84
|
-
try:
|
|
85
|
-
control_server = FdirManagerControlServer()
|
|
86
|
-
control_server.serve()
|
|
87
|
-
except KeyboardInterrupt:
|
|
88
|
-
print("Shutdown requested...exiting")
|
|
89
|
-
except SystemExit as exit_code:
|
|
90
|
-
print("System Exit with code {}.".format(exit_code))
|
|
91
|
-
sys.exit(exit_code)
|
|
92
|
-
except Exception:
|
|
93
|
-
import traceback
|
|
94
|
-
|
|
95
|
-
traceback.print_exc(file=sys.stdout)
|
|
96
|
-
|
|
97
|
-
return 0
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
@cli.command()
|
|
101
|
-
def stop():
|
|
102
|
-
"""Send a 'quit_server' command to the Configuration Manager."""
|
|
103
|
-
with FdirManagerProxy() as fm:
|
|
104
|
-
sp = fm.get_service_proxy()
|
|
105
|
-
sp.quit_server()
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
@cli.command()
|
|
109
|
-
def status():
|
|
110
|
-
"""Print the status of the control server."""
|
|
111
|
-
pass
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
def check_prerequisites():
|
|
115
|
-
""" Checks if the recovery script location is defined and valid.
|
|
116
|
-
|
|
117
|
-
Raises:
|
|
118
|
-
RuntimeError.
|
|
119
|
-
"""
|
|
120
|
-
|
|
121
|
-
location = CTRL_SETTINGS.RECOVERY_SCRIPT_LOCATION
|
|
122
|
-
location = replace_environment_variable(location)
|
|
123
|
-
|
|
124
|
-
if not location:
|
|
125
|
-
raise RuntimeError(
|
|
126
|
-
"The environment variable referenced in the Settings.yaml file for the "
|
|
127
|
-
"RECOVERY_SCRIPT_LOCATION of the FDIR control server does not exist, please set "
|
|
128
|
-
"the environment variable."
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
location = Path(location)
|
|
132
|
-
|
|
133
|
-
if not location.exists():
|
|
134
|
-
raise RuntimeError(
|
|
135
|
-
f"The directory {location} does not exist, provide a valid location for "
|
|
136
|
-
f"recovery scripts."
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
logger.debug(f"recovery script location = {location}")
|
|
140
|
-
|
|
141
|
-
location = CTRL_SETTINGS.LOGGING_LOCATION
|
|
142
|
-
location = replace_environment_variable(location)
|
|
143
|
-
|
|
144
|
-
if not location:
|
|
145
|
-
raise RuntimeError(
|
|
146
|
-
"The environment variable referenced in the Settings.yaml file for the "
|
|
147
|
-
"LOGGING_LOCATION of the FDIR control server does not exist, please set "
|
|
148
|
-
"the environment variable."
|
|
149
|
-
)
|
|
150
|
-
|
|
151
|
-
location = Path(location)
|
|
152
|
-
|
|
153
|
-
if not location.exists():
|
|
154
|
-
raise RuntimeError(
|
|
155
|
-
f"The directory {location} does not exist, provide a valid location for "
|
|
156
|
-
f"the log output of recovery scripts."
|
|
157
|
-
)
|
|
158
|
-
|
|
159
|
-
logger.debug(f"FDIR recovery script logging location = {location}")
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
if __name__ == "__main__":
|
|
163
|
-
|
|
164
|
-
sys.exit(cli())
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
from egse.decorators import dynamic_interface
|
|
2
|
-
|
|
3
|
-
class FdirManagerInterface:
|
|
4
|
-
""" Descriptions of the interface can be found in the corresponding yaml file. """
|
|
5
|
-
@dynamic_interface
|
|
6
|
-
def signal_fdir(self, fdir_code: int):
|
|
7
|
-
raise NotImplementedError
|
|
8
|
-
|
|
9
|
-
@dynamic_interface
|
|
10
|
-
def clear_fdir(self):
|
|
11
|
-
raise NotImplementedError
|
|
12
|
-
|
|
13
|
-
@dynamic_interface
|
|
14
|
-
def get_state(self):
|
|
15
|
-
raise NotImplementedError
|
egse/fdir/fdir_remote.py
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
|
|
3
|
-
from egse.command import ClientServerCommand
|
|
4
|
-
from egse.control import ControlServer
|
|
5
|
-
from egse.proxy import Proxy
|
|
6
|
-
from egse.protocol import CommandProtocol
|
|
7
|
-
from egse.settings import Settings
|
|
8
|
-
from egse.zmq_ser import connect_address, bind_address
|
|
9
|
-
from egse.system import format_datetime
|
|
10
|
-
from egse.fdir.fdir_remote_interface import FdirRemoteInterface
|
|
11
|
-
from egse.fdir.fdir_remote_controller import FdirRemoteController
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
CTRL_SETTINGS = Settings.load("FDIR Remote Control Server")
|
|
17
|
-
DEVICE_SETTINGS = Settings.load(filename="fdir_remote.yaml")
|
|
18
|
-
SITE_ID = Settings.load("SITE").ID
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class FdirRemoteCommand(ClientServerCommand):
|
|
22
|
-
pass
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class FdirRemoteProxy(Proxy, FdirRemoteInterface):
|
|
26
|
-
""" The FDIR Remote Proxy class is used to connect to the FDIR remote
|
|
27
|
-
control server. It should only be used by the fdir manager.
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
def __init__(
|
|
31
|
-
self,
|
|
32
|
-
protocol=CTRL_SETTINGS.PROTOCOL,
|
|
33
|
-
hostname=CTRL_SETTINGS.HOSTNAME,
|
|
34
|
-
port=CTRL_SETTINGS.COMMANDING_PORT,
|
|
35
|
-
):
|
|
36
|
-
super().__init__(connect_address(protocol, hostname, port))
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
class FdirRemoteProtocol(CommandProtocol):
|
|
40
|
-
|
|
41
|
-
def __init__(self, control_server: ControlServer):
|
|
42
|
-
|
|
43
|
-
super().__init__()
|
|
44
|
-
|
|
45
|
-
self.control_server = control_server
|
|
46
|
-
self.controller = FdirRemoteController()
|
|
47
|
-
|
|
48
|
-
self.load_commands(
|
|
49
|
-
DEVICE_SETTINGS.Commands,
|
|
50
|
-
FdirRemoteCommand,
|
|
51
|
-
FdirRemoteController,
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
self.build_device_method_lookup_table(self.controller)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def get_bind_address(self):
|
|
58
|
-
|
|
59
|
-
return bind_address(
|
|
60
|
-
self.control_server.get_communication_protocol(),
|
|
61
|
-
self.control_server.get_commanding_port(),
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
def get_status(self):
|
|
66
|
-
|
|
67
|
-
return super().get_status()
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
# The FDIR remote is stateless, so no HK.
|
|
71
|
-
def get_housekeeping(self):
|
|
72
|
-
|
|
73
|
-
return {"timestamp": format_datetime()}
|
egse/fdir/fdir_remote.yaml
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
BaseClass:
|
|
2
|
-
egse.fdir.FdirRemoteInterface
|
|
3
|
-
|
|
4
|
-
ProxyClass:
|
|
5
|
-
egse.fdir.FdirRemoteProxy
|
|
6
|
-
|
|
7
|
-
ControlServerClass:
|
|
8
|
-
egse.alert.FdirRemoteControlServer
|
|
9
|
-
|
|
10
|
-
ControlServer:
|
|
11
|
-
egse.fdir.fdir_remote_cs
|
|
12
|
-
|
|
13
|
-
Commands:
|
|
14
|
-
is_connected:
|
|
15
|
-
description:
|
|
16
|
-
args:
|
|
17
|
-
cmd: ""
|
|
18
|
-
|
|
19
|
-
is_simulator:
|
|
20
|
-
description:
|
|
21
|
-
args:
|
|
22
|
-
cmd: ""
|
|
23
|
-
|
|
24
|
-
generate_popup:
|
|
25
|
-
description: Generate a pop-up on the remote (client) machine to warn about an FDIR situation.
|
|
26
|
-
args:
|
|
27
|
-
code: str | fdir code
|
|
28
|
-
actions: str | list of actions performed (delimited by newlines)
|
|
29
|
-
success: bool | whether the recovery script was executed successfuly
|
|
30
|
-
cmd: "{code}{actions}{success}"
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import logging
|
|
3
|
-
import subprocess
|
|
4
|
-
|
|
5
|
-
from egse.control import Response
|
|
6
|
-
from egse.fdir.fdir_remote_interface import FdirRemoteInterface
|
|
7
|
-
|
|
8
|
-
logger = logging.getLogger(__name__)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class FdirRemoteController(FdirRemoteInterface):
|
|
12
|
-
def __init__(self):
|
|
13
|
-
self.dialog = None
|
|
14
|
-
|
|
15
|
-
def is_connected(self):
|
|
16
|
-
return True
|
|
17
|
-
|
|
18
|
-
def is_simulator(self):
|
|
19
|
-
return False
|
|
20
|
-
|
|
21
|
-
def generate_popup(self, code: str, actions: str, success: bool) -> Response:
|
|
22
|
-
path = os.path.dirname(os.path.abspath(__file__))
|
|
23
|
-
subprocess.Popen(['python3', f'{path}/fdir_remote_popup.py', code, actions, str(success)])
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if __name__ == "__main__":
|
|
29
|
-
fdir = FdirRemoteController()
|
|
30
|
-
fdir.generate_popup("FDIR_CS_STOPPED", "rip", True)
|
egse/fdir/fdir_remote_cs.py
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import multiprocessing
|
|
3
|
-
import sys
|
|
4
|
-
import click
|
|
5
|
-
import zmq
|
|
6
|
-
|
|
7
|
-
from prometheus_client import start_http_server
|
|
8
|
-
|
|
9
|
-
from egse.settings import Settings
|
|
10
|
-
from egse.control import ControlServer
|
|
11
|
-
from egse.fdir.fdir_remote import FdirRemoteProtocol, FdirRemoteProxy
|
|
12
|
-
|
|
13
|
-
logger = logging.getLogger(__name__)
|
|
14
|
-
|
|
15
|
-
CTRL_SETTINGS = Settings.load("FDIR Remote Control Server")
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class FdirRemoteControlServer(ControlServer):
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def __init__(self):
|
|
22
|
-
super().__init__()
|
|
23
|
-
self.device_protocol = FdirRemoteProtocol(self)
|
|
24
|
-
self.logger.debug(f"Binding ZeroMQ socket to {self.device_protocol.get_bind_address()}")
|
|
25
|
-
self.device_protocol.bind(self.dev_ctrl_cmd_sock)
|
|
26
|
-
self.poller.register(self.dev_ctrl_cmd_sock, zmq.POLLIN)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def get_communication_protocol(self):
|
|
30
|
-
return CTRL_SETTINGS.PROTOCOL
|
|
31
|
-
|
|
32
|
-
def get_commanding_port(self):
|
|
33
|
-
return CTRL_SETTINGS.COMMANDING_PORT
|
|
34
|
-
|
|
35
|
-
def get_service_port(self):
|
|
36
|
-
return CTRL_SETTINGS.SERVICE_PORT
|
|
37
|
-
|
|
38
|
-
def get_monitoring_port(self):
|
|
39
|
-
return CTRL_SETTINGS.MONITORING_PORT
|
|
40
|
-
|
|
41
|
-
def get_storage_mnemonic(self):
|
|
42
|
-
try:
|
|
43
|
-
return CTRL_SETTINGS.STORAGE_MNEMONIC
|
|
44
|
-
except AttributeError:
|
|
45
|
-
return "FR"
|
|
46
|
-
|
|
47
|
-
def before_serve(self):
|
|
48
|
-
start_http_server(CTRL_SETTINGS.METRICS_PORT)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
@click.group()
|
|
52
|
-
def cli():
|
|
53
|
-
pass
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
@cli.command()
|
|
57
|
-
def start():
|
|
58
|
-
""" Starts the FDIR Control Server. """
|
|
59
|
-
|
|
60
|
-
multiprocessing.current_process().name = "fdir_remote_cs"
|
|
61
|
-
|
|
62
|
-
try:
|
|
63
|
-
control_server = FdirRemoteControlServer()
|
|
64
|
-
control_server.serve()
|
|
65
|
-
except KeyboardInterrupt:
|
|
66
|
-
print("Shutdown requested...exiting")
|
|
67
|
-
except SystemExit as exit_code:
|
|
68
|
-
print("System Exit with code {}.".format(exit_code))
|
|
69
|
-
sys.exit(exit_code)
|
|
70
|
-
except Exception:
|
|
71
|
-
import traceback
|
|
72
|
-
|
|
73
|
-
traceback.print_exc(file=sys.stdout)
|
|
74
|
-
|
|
75
|
-
return 0
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
@cli.command()
|
|
79
|
-
def stop():
|
|
80
|
-
"""Send a 'quit_server' command to the Configuration Manager."""
|
|
81
|
-
with FdirRemoteProxy() as fm:
|
|
82
|
-
sp = fm.get_service_proxy()
|
|
83
|
-
sp.quit_server()
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
@cli.command()
|
|
87
|
-
def status():
|
|
88
|
-
"""Print the status of the control server."""
|
|
89
|
-
pass
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if __name__ == "__main__":
|
|
93
|
-
|
|
94
|
-
sys.exit(cli())
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
from egse.decorators import dynamic_interface
|
|
2
|
-
from egse.control import Response
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class FdirRemoteInterface:
|
|
6
|
-
""" Descriptions of the interface can be found in the corresponding yaml file. """
|
|
7
|
-
@dynamic_interface
|
|
8
|
-
def generate_popup(self, code: int, actions, success) -> Response:
|
|
9
|
-
raise NotImplementedError
|
egse/fdir/fdir_remote_popup.py
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import sys
|
|
3
|
-
from argparse import ArgumentParser
|
|
4
|
-
|
|
5
|
-
from egse.fdir import generate_popup
|
|
6
|
-
|
|
7
|
-
# This function can be used generates a pop-up window when an FDIR situation was triggered.
|
|
8
|
-
# This is put into a separate module to avoid having to run the QT thread in the control server
|
|
9
|
-
# (where the popup is generated). There are probably better ways to do this but this works.
|
|
10
|
-
def main():
|
|
11
|
-
|
|
12
|
-
logger = logging.getLogger(__name__)
|
|
13
|
-
|
|
14
|
-
parser = ArgumentParser()
|
|
15
|
-
parser.add_argument('code', type=str, help='FDIR code string')
|
|
16
|
-
parser.add_argument('success', type=str, help='recovery script success')
|
|
17
|
-
parser.add_argument('actions', type=str, help='actions taken')
|
|
18
|
-
args = parser.parse_args()
|
|
19
|
-
|
|
20
|
-
generate_popup(args.code, args.success, args.actions)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
if __name__ == '__main__':
|
|
25
|
-
main()
|
|
26
|
-
sys.exit()
|
egse/fee/__init__.py
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module defines all functionality with respect to the FEE. It defines the structure of the FEE
|
|
3
|
-
internal register map and the FEE housekeeping packet. The module also provides the FEE Simulator.
|
|
4
|
-
|
|
5
|
-
Currently, only the N-FEE functionality is implemented in this module.
|
|
6
|
-
"""
|
|
7
|
-
from enum import IntEnum
|
|
8
|
-
from typing import List
|
|
9
|
-
|
|
10
|
-
from egse.setup import SetupError
|
|
11
|
-
from egse.state import GlobalState
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def convert_ccd_order_list(value: List[int]):
|
|
15
|
-
"""
|
|
16
|
-
Convert a list of CCD numbers into their binary representation that is used by the
|
|
17
|
-
register map of the N-FEE.
|
|
18
|
-
|
|
19
|
-
Examples:
|
|
20
|
-
>>> bin(convert_ccd_order_list([1,2,3,4]))
|
|
21
|
-
'0b1001110'
|
|
22
|
-
>>> bin(convert_ccd_order_list([2,2,4,4]))
|
|
23
|
-
'0b1011111'
|
|
24
|
-
|
|
25
|
-
Args:
|
|
26
|
-
value (List): a list of four CCD numbers in the range [1-4]
|
|
27
|
-
|
|
28
|
-
Returns:
|
|
29
|
-
The binary representation of the ccd_readout_order.
|
|
30
|
-
|
|
31
|
-
"""
|
|
32
|
-
if len(value) != 4:
|
|
33
|
-
raise ValueError(f"Expected a list of four CCD numbers, got {value}")
|
|
34
|
-
if min(value) < 1 or max(value) > 4:
|
|
35
|
-
raise ValueError(f"Expected all CCD numbers in the range [1-4], got {value}")
|
|
36
|
-
try:
|
|
37
|
-
return sum(GlobalState.setup.camera.fee.ccd_numbering.CCD_ID_TO_BIN[ccd] << idx * 2
|
|
38
|
-
for idx, ccd in enumerate(value))
|
|
39
|
-
except AttributeError:
|
|
40
|
-
raise SetupError("No entry in the setup for camera.fee.ccd_numbering.CCD_ID_TO_BIN")
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def convert_ccd_order_value(value: int):
|
|
44
|
-
"""
|
|
45
|
-
Convert a binary representation of the CCD readout order (ccd_readout_order) into a list
|
|
46
|
-
of CCD numbers.
|
|
47
|
-
|
|
48
|
-
Examples:
|
|
49
|
-
>>> convert_ccd_order_value(228)
|
|
50
|
-
[3, 4, 1, 2]
|
|
51
|
-
>>> convert_ccd_order_value(0x4E)
|
|
52
|
-
[1, 2, 3, 4]
|
|
53
|
-
|
|
54
|
-
Args:
|
|
55
|
-
value (int): the CCD readout order as returned by the N-FEE
|
|
56
|
-
|
|
57
|
-
Returns:
|
|
58
|
-
A list of CCD numbers.
|
|
59
|
-
"""
|
|
60
|
-
|
|
61
|
-
try:
|
|
62
|
-
return [GlobalState.setup.camera.fee.ccd_numbering.CCD_BIN_TO_ID[(value >> x) & 0b11] for x in [0, 2, 4, 6]]
|
|
63
|
-
except AttributeError:
|
|
64
|
-
raise SetupError("No entry in the setup for camera.fee.ccd_numbering.CCD_BIN_TO_ID")
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
# The name of the of the enum class `fee_mode` is deliberately chosen in snake case,
|
|
68
|
-
# although PEP8 prescribes the use of CamelCase for class names. The reason for this choice
|
|
69
|
-
# is readability because the members of the enum are in all caps anyway.
|
|
70
|
-
#
|
|
71
|
-
# fee_mode.ON_MODE is more readable than NFEEMode.ON_MODE (IMHO)
|
|
72
|
-
|
|
73
|
-
# noinspection PyPep8Naming
|
|
74
|
-
|
|
75
|
-
# noinspection PyPep8Naming
|
|
76
|
-
class fee_sync_mode(IntEnum):
|
|
77
|
-
"""
|
|
78
|
-
The sync mode defines if the FEE is using external or internal synchronisation signals.
|
|
79
|
-
"""
|
|
80
|
-
|
|
81
|
-
EXTERNAL = 0
|
|
82
|
-
INTERNAL = 1
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
# noinspection PyPep8Naming
|
|
86
|
-
class n_fee_mode(IntEnum):
|
|
87
|
-
"""
|
|
88
|
-
Enumeration of the operating modes for the N-FEE.
|
|
89
|
-
"""
|
|
90
|
-
|
|
91
|
-
ON_MODE = 0x0
|
|
92
|
-
FULL_IMAGE_PATTERN_MODE = 0x1
|
|
93
|
-
WINDOWING_PATTERN_MODE = 0x2
|
|
94
|
-
# NOT_DEFINED_MODE = 0x3
|
|
95
|
-
STAND_BY_MODE = 0x4
|
|
96
|
-
FULL_IMAGE_MODE = 0x5
|
|
97
|
-
WINDOWING_MODE = 0x6
|
|
98
|
-
PERFORMANCE_TEST_MODE = 0x7
|
|
99
|
-
IMMEDIATE_ON_MODE = 0x8
|
|
100
|
-
PARALLEL_TRAP_PUMPING_1_MODE = 0x9
|
|
101
|
-
PARALLEL_TRAP_PUMPING_2_MODE = 0xA
|
|
102
|
-
SERIAL_TRAP_PUMPING_1_MODE = 0xB
|
|
103
|
-
SERIAL_TRAP_PUMPING_2_MODE = 0xC
|
|
104
|
-
# RESERVED_MODE = 0xD
|
|
105
|
-
# RESERVED_MODE = 0xE
|
|
106
|
-
# RESERVED_MODE = 0xF
|