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/dsi/spw.py
DELETED
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module contains functions to handle SpaceWire communication.
|
|
3
|
-
"""
|
|
4
|
-
from __future__ import annotations
|
|
5
|
-
|
|
6
|
-
import logging
|
|
7
|
-
import socket
|
|
8
|
-
import textwrap
|
|
9
|
-
from typing import Tuple
|
|
10
|
-
|
|
11
|
-
import egse.rmap
|
|
12
|
-
import egse.spw
|
|
13
|
-
from egse.dsi import constants
|
|
14
|
-
from egse.dsi.constants import esl_rmap_error_codes
|
|
15
|
-
from egse.dsi.esl import ESLError
|
|
16
|
-
from egse.dsi.esl import esl_close_connection
|
|
17
|
-
from egse.dsi.esl import esl_configure
|
|
18
|
-
from egse.dsi.esl import esl_flush
|
|
19
|
-
from egse.dsi.esl import esl_get_active_link
|
|
20
|
-
from egse.dsi.esl import esl_get_hwa
|
|
21
|
-
from egse.dsi.esl import esl_get_manufacturer_string
|
|
22
|
-
from egse.dsi.esl import esl_get_number_of_links
|
|
23
|
-
from egse.dsi.esl import esl_get_product_string
|
|
24
|
-
from egse.dsi.esl import esl_get_serial_number
|
|
25
|
-
from egse.dsi.esl import esl_open_connection
|
|
26
|
-
from egse.dsi.esl import esl_read_packet
|
|
27
|
-
from egse.dsi.esl import esl_send_timecode
|
|
28
|
-
from egse.dsi.esl import esl_set_active_link
|
|
29
|
-
from egse.dsi.esl import esl_write_packet
|
|
30
|
-
from egse.dsi.rmap import rmap_configure
|
|
31
|
-
from egse.dsi.rmap import rmap_open_connection
|
|
32
|
-
from egse.settings import Settings
|
|
33
|
-
from egse.spw import SpaceWireInterface
|
|
34
|
-
from egse.spw import SpaceWirePacket
|
|
35
|
-
from egse.spw import WriteRequestReply
|
|
36
|
-
from egse.spw import ReadRequestReply
|
|
37
|
-
|
|
38
|
-
LOGGER = logging.getLogger(__name__)
|
|
39
|
-
|
|
40
|
-
DSI_SETTINGS = Settings.load("DSI")
|
|
41
|
-
|
|
42
|
-
# Naming conventions:
|
|
43
|
-
#
|
|
44
|
-
# rx_buffer:
|
|
45
|
-
# is used for any buffer (of type bytes) that is or was received over the SpaceWire interface.
|
|
46
|
-
# tx_buffer:
|
|
47
|
-
# is used for any buffer (of type bytes) that will be transmitted over the SpaceWire interface.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def handle_extension_packet(rx_buffer: bytes, bytes_received: int):
|
|
51
|
-
"""
|
|
52
|
-
Decide how to handle the extension packet that was received over the SpaceWire.
|
|
53
|
-
|
|
54
|
-
The following extension packets are supported:
|
|
55
|
-
|
|
56
|
-
* a timecode packet
|
|
57
|
-
|
|
58
|
-
Args:
|
|
59
|
-
rx_buffer (bytes): the packet that was received as a bytes object
|
|
60
|
-
bytes_received (int): the length of the rx_buffer (allocated space might be larger)
|
|
61
|
-
|
|
62
|
-
Returns:
|
|
63
|
-
Nothing: yet.
|
|
64
|
-
|
|
65
|
-
"""
|
|
66
|
-
LOGGER.debug("*" * 80)
|
|
67
|
-
LOGGER.debug("Extension Packet returned by DSI")
|
|
68
|
-
LOGGER.debug(
|
|
69
|
-
f"extension packet: {bin(int.from_bytes(rx_buffer, 'big'))} (length={bytes_received})"
|
|
70
|
-
)
|
|
71
|
-
LOGGER.debug("*" * 80)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def handle_special_packet(rx_buffer: bytes, bytes_received: int):
|
|
75
|
-
"""
|
|
76
|
-
Decide how to handle a special packet that was received over the SpaceWire interface.
|
|
77
|
-
|
|
78
|
-
Args:
|
|
79
|
-
rx_buffer (bytes): the packet that was received as a bytes object
|
|
80
|
-
bytes_received (int): the length of the rx_buffer (allocated space might be larger)
|
|
81
|
-
|
|
82
|
-
Returns:
|
|
83
|
-
Nothing: yet.
|
|
84
|
-
|
|
85
|
-
"""
|
|
86
|
-
LOGGER.debug("*" * 80)
|
|
87
|
-
LOGGER.debug("Special Packet returned by DSI")
|
|
88
|
-
LOGGER.debug(f"Special packet: {rx_buffer} (length={bytes_received})")
|
|
89
|
-
LOGGER.debug("*" * 80)
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
class SpaceWireOverDSI(SpaceWireInterface):
|
|
93
|
-
"""
|
|
94
|
-
The SpaceWireOverDSI implements the SpaceWire communication/transport over a Diagnostic
|
|
95
|
-
SpaceWire Interface (DSI).
|
|
96
|
-
"""
|
|
97
|
-
|
|
98
|
-
def __init__(self, dsi_address, dsi_port, esl_link=None, rmap_link=None):
|
|
99
|
-
self.dsi_address = dsi_address
|
|
100
|
-
self.dsi_port = dsi_port
|
|
101
|
-
self.esl_link = esl_link
|
|
102
|
-
self.rmap_link = rmap_link
|
|
103
|
-
self.socket = None
|
|
104
|
-
|
|
105
|
-
def __str__(self):
|
|
106
|
-
hwa = esl_get_hwa(self.esl_link)
|
|
107
|
-
serial_number = esl_get_serial_number(self.esl_link)
|
|
108
|
-
|
|
109
|
-
msg = textwrap.dedent(f"""\
|
|
110
|
-
Info on SpaceWire Interface:
|
|
111
|
-
Manufacturer {esl_get_manufacturer_string(self.esl_link)}
|
|
112
|
-
Product {esl_get_product_string(self.esl_link)}
|
|
113
|
-
Number of links {esl_get_number_of_links(self.esl_link)} [active port={esl_get_active_link(self.esl_link)}]
|
|
114
|
-
Serial number {serial_number}
|
|
115
|
-
Hardware Address 0x{hwa[0]:02X}-{hwa[1]:02X}-{hwa[2]:02X}-{hwa[3]:02X}-{hwa[4]:02X}-{hwa[5]:02X}
|
|
116
|
-
"""
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
return msg
|
|
120
|
-
|
|
121
|
-
def connect(self):
|
|
122
|
-
if self.esl_link is None:
|
|
123
|
-
self.esl_link = esl_open_connection(self.dsi_address)
|
|
124
|
-
if self.rmap_link is None:
|
|
125
|
-
self.rmap_link = rmap_open_connection(self.esl_link)
|
|
126
|
-
# esl_print_info(self.esl_link)
|
|
127
|
-
|
|
128
|
-
def disconnect(self):
|
|
129
|
-
esl_close_connection(self.esl_link)
|
|
130
|
-
|
|
131
|
-
def configure(self):
|
|
132
|
-
esl_configure(
|
|
133
|
-
self.esl_link,
|
|
134
|
-
active_link=self.dsi_port,
|
|
135
|
-
speed=DSI_SETTINGS.LINK_SPEED,
|
|
136
|
-
mode=constants.ESL_LINK_MODE_NORMAL,
|
|
137
|
-
report=constants.ESL_ER_REPORT_PARITY_ERROR
|
|
138
|
-
| constants.ESL_ER_REPORT_TIME_CODE
|
|
139
|
-
| constants.ESL_ER_REPORT_ESC_EOP
|
|
140
|
-
| constants.ESL_ER_REPORT_ESC_EEP
|
|
141
|
-
| constants.ESL_ER_REPORT_ESC_ESC
|
|
142
|
-
| constants.ESL_ER_REPORT_TIMEOUT,
|
|
143
|
-
)
|
|
144
|
-
|
|
145
|
-
rmap_configure(
|
|
146
|
-
self.rmap_link,
|
|
147
|
-
target_key=constants.RMAP_TARGET_KEY,
|
|
148
|
-
initiator_logical_address=DSI_SETTINGS.INITIATOR_LOGICAL_ADDRESS,
|
|
149
|
-
target_logical_address=DSI_SETTINGS.TARGET_LOGICAL_ADDRESS,
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
# esl_print_summary_of_structure(self.esl_link)
|
|
153
|
-
|
|
154
|
-
def get_socket(self):
|
|
155
|
-
"""
|
|
156
|
-
Returns the TCP socket that is associated with this transport.
|
|
157
|
-
|
|
158
|
-
Returns:
|
|
159
|
-
A TCP socket or None when the transport has not been initialized or connected.
|
|
160
|
-
"""
|
|
161
|
-
# This 'trick' of getting the socket from the `fileno` works only once, so, if we have already
|
|
162
|
-
# requested the socket for this `fileno`, don't do it again. It will either result in a
|
|
163
|
-
# `OSError: [Errno 9] Bad file descriptor` or I've seen that a new socket created with the same
|
|
164
|
-
# family and type will reuse the same `fileno` down the line...
|
|
165
|
-
|
|
166
|
-
if self.socket is None and self.esl_link is not None:
|
|
167
|
-
sock_fd = self.esl_link.contents.sock
|
|
168
|
-
self.socket = socket.socket(fileno=sock_fd) # This is how to get the socket from the esl_connection.
|
|
169
|
-
|
|
170
|
-
return self.socket
|
|
171
|
-
|
|
172
|
-
def set_active_link(self, port: int):
|
|
173
|
-
"""
|
|
174
|
-
Sets the active SpW port on the DSI.
|
|
175
|
-
|
|
176
|
-
Raises:
|
|
177
|
-
An ESLError when an invalid link is provided.
|
|
178
|
-
|
|
179
|
-
Returns:
|
|
180
|
-
The return code of the library call.
|
|
181
|
-
"""
|
|
182
|
-
rc = esl_set_active_link(self.esl_link, port)
|
|
183
|
-
if rc == constants.ESL_API_INVALID_LINK: # noqa
|
|
184
|
-
raise ESLError(
|
|
185
|
-
f"Could not set active link {port}, ESL error: Invalid Link selected [-45]."
|
|
186
|
-
)
|
|
187
|
-
|
|
188
|
-
return rc
|
|
189
|
-
|
|
190
|
-
def get_active_link(self):
|
|
191
|
-
"""Return the number of the currently active SpW port on the DSI."""
|
|
192
|
-
return esl_get_active_link(self.esl_link)
|
|
193
|
-
|
|
194
|
-
def flush(self):
|
|
195
|
-
esl_flush(self.esl_link)
|
|
196
|
-
|
|
197
|
-
def send_timecode(self, timecode: int) -> int:
|
|
198
|
-
return esl_send_timecode(self.esl_link, timecode)
|
|
199
|
-
|
|
200
|
-
def read_packet(self, timeout: int = None) -> Tuple[int, bytes]:
|
|
201
|
-
return esl_read_packet(self.esl_link, timeout=timeout)
|
|
202
|
-
|
|
203
|
-
def write_packet(self, packet: bytes) -> int:
|
|
204
|
-
return esl_write_packet(self.esl_link, packet, len(packet), constants.ESL_EOP) # noqa
|
|
205
|
-
|
|
206
|
-
def read_register(self, address: int, length: int = 4, strict: bool = True) -> bytes:
|
|
207
|
-
reply_packet = self.rmap_read_request(address, length, strict=strict)
|
|
208
|
-
|
|
209
|
-
if reply_packet is None:
|
|
210
|
-
LOGGER.critical(f"read_register() failed: An error occurred in the rmap_read_request() call.")
|
|
211
|
-
return bytes()
|
|
212
|
-
|
|
213
|
-
return reply_packet.data
|
|
214
|
-
|
|
215
|
-
def write_register(self, address: int, data: bytes) -> int:
|
|
216
|
-
reply_packet = self.rmap_write_request(address, data)
|
|
217
|
-
|
|
218
|
-
if reply_packet is None:
|
|
219
|
-
LOGGER.critical(f"write_register() failed: An error occurred in the rmap_write_request() call.")
|
|
220
|
-
return -1
|
|
221
|
-
|
|
222
|
-
if reply_packet.status:
|
|
223
|
-
LOGGER.warning(f"write_register() failed: An error occurred in the rmap_write_request() call: "
|
|
224
|
-
f"{reply_packet.status = }")
|
|
225
|
-
|
|
226
|
-
return reply_packet.status
|
|
227
|
-
|
|
228
|
-
def read_memory_map(self, address: int, size: int) -> bytes:
|
|
229
|
-
reply_packet = self.rmap_read_request(address, size, strict=False)
|
|
230
|
-
|
|
231
|
-
if reply_packet is None:
|
|
232
|
-
LOGGER.critical(f"read_memory_map(): An error occurred in the rmap_read_request() call.")
|
|
233
|
-
return bytes()
|
|
234
|
-
|
|
235
|
-
return reply_packet.data
|
|
236
|
-
|
|
237
|
-
def rmap_read_request(
|
|
238
|
-
self, address: int, length: int, timeout: int = 1000, strict: bool = True) -> ReadRequestReply | None:
|
|
239
|
-
"""
|
|
240
|
-
Read `length` bytes from the remote memory starting at `address`.
|
|
241
|
-
|
|
242
|
-
Args:
|
|
243
|
-
address: the start address (32-bit aligned) in the remote memory
|
|
244
|
-
length: the number of bytes to read from the remote memory
|
|
245
|
-
timeout: timeout in milliseconds
|
|
246
|
-
strict: perform strict checking of read areas
|
|
247
|
-
|
|
248
|
-
Returns:
|
|
249
|
-
A tuple containing the terminator value and the RMAP Reply packet with the data read from
|
|
250
|
-
the remote memory.
|
|
251
|
-
|
|
252
|
-
"""
|
|
253
|
-
# TODO:
|
|
254
|
-
# the timeout parameter is currently not implemented
|
|
255
|
-
|
|
256
|
-
self.rmap_link.transaction_identifier = egse.spw.update_transaction_identifier(self.rmap_link.transaction_identifier)
|
|
257
|
-
|
|
258
|
-
buffer = egse.rmap.create_rmap_read_request_packet(
|
|
259
|
-
address, length, self.rmap_link.transaction_identifier, strict=strict)
|
|
260
|
-
|
|
261
|
-
result = esl_write_packet(self.rmap_link.spw_device, buffer, len(buffer), constants.ESL_EOP) # noqa
|
|
262
|
-
if result:
|
|
263
|
-
raise egse.rmap.RMAPError(
|
|
264
|
-
f"Couldn't send data within timeout of {timeout} ms, "
|
|
265
|
-
f"ESL RMAP Error Code = {esl_rmap_error_codes[self.rmap_link.ESL_RMAP_error]} ["
|
|
266
|
-
f"{self.rmap_link.ESL_RMAP_error}]")
|
|
267
|
-
|
|
268
|
-
result = esl_flush(self.rmap_link.spw_device)
|
|
269
|
-
if result:
|
|
270
|
-
raise egse.rmap.RMAPError(
|
|
271
|
-
f"Couldn't send data or clear buffers, "
|
|
272
|
-
f"ESL RMAP Error Code = {esl_rmap_error_codes[self.rmap_link.ESL_RMAP_error]} ["
|
|
273
|
-
f"{self.rmap_link.ESL_RMAP_error}]")
|
|
274
|
-
|
|
275
|
-
# Read the read request reply packet
|
|
276
|
-
|
|
277
|
-
_, rx_buffer = esl_read_packet(self.rmap_link.spw_device, timeout=timeout)
|
|
278
|
-
|
|
279
|
-
if rx_buffer:
|
|
280
|
-
reply_packet = SpaceWirePacket.create_packet(rx_buffer)
|
|
281
|
-
return reply_packet if isinstance(reply_packet, ReadRequestReply) else None
|
|
282
|
-
|
|
283
|
-
return None
|
|
284
|
-
|
|
285
|
-
def rmap_write_request(
|
|
286
|
-
self, address: int, data: bytes, length: int = 4, timeout: int = 1000) -> WriteRequestReply | None:
|
|
287
|
-
"""
|
|
288
|
-
Sends an RMAP write command over the SpaceWire link.
|
|
289
|
-
|
|
290
|
-
Based on the address this function will decided to send a verified or unverified write request.
|
|
291
|
-
|
|
292
|
-
TODO: the timeout parameter is currently not implemented.
|
|
293
|
-
|
|
294
|
-
Args:
|
|
295
|
-
address: the starting memory address to which the data from buffer will be written
|
|
296
|
-
data: the data that will be written into the targets memory
|
|
297
|
-
length: the number of bytes to write (the buffer maybe longer) [default=4]
|
|
298
|
-
timeout: timeout in milliseconds [default=1000]
|
|
299
|
-
|
|
300
|
-
Returns:
|
|
301
|
-
The Write Request Reply packet.
|
|
302
|
-
|
|
303
|
-
Raises:
|
|
304
|
-
egse.rmap.RMAPError: when data can not be written on the target.
|
|
305
|
-
|
|
306
|
-
"""
|
|
307
|
-
|
|
308
|
-
self.rmap_link.transaction_identifier = egse.spw.update_transaction_identifier(
|
|
309
|
-
self.rmap_link.transaction_identifier
|
|
310
|
-
)
|
|
311
|
-
|
|
312
|
-
if egse.rmap.CRITICAL_AREA_START <= address <= egse.rmap.CRITICAL_AREA_END:
|
|
313
|
-
buffer = egse.rmap.create_rmap_verified_write_packet(
|
|
314
|
-
address, data, self.rmap_link.transaction_identifier)
|
|
315
|
-
else:
|
|
316
|
-
buffer = egse.rmap.create_rmap_unverified_write_packet(
|
|
317
|
-
address, data, length, self.rmap_link.transaction_identifier)
|
|
318
|
-
|
|
319
|
-
result = esl_write_packet(self.esl_link, buffer, len(buffer), constants.ESL_EOP) # noqa
|
|
320
|
-
if result:
|
|
321
|
-
raise egse.rmap.RMAPError(f"Couldn't send data ({len(buffer)} bytes) within timeout of {timeout} ms.")
|
|
322
|
-
|
|
323
|
-
result = esl_flush(self.esl_link)
|
|
324
|
-
if result:
|
|
325
|
-
raise egse.rmap.RMAPError(f"Couldn't send data or flush buffers.")
|
|
326
|
-
|
|
327
|
-
# Read the write request reply message
|
|
328
|
-
|
|
329
|
-
_, rx_buffer = esl_read_packet(self.esl_link)
|
|
330
|
-
|
|
331
|
-
if rx_buffer:
|
|
332
|
-
reply_packet = SpaceWirePacket.create_packet(rx_buffer)
|
|
333
|
-
return reply_packet if isinstance(reply_packet, WriteRequestReply) else None
|
|
334
|
-
|
|
335
|
-
return None
|
egse/dsi/spw_state.py
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
class SpaceWireLinkState:
|
|
2
|
-
def __init__(self):
|
|
3
|
-
self.linkDisabled = True
|
|
4
|
-
self.linkStart = False
|
|
5
|
-
self.autoStart = False
|
|
6
|
-
self.gotNULL = False
|
|
7
|
-
|
|
8
|
-
def isEnabled(self):
|
|
9
|
-
return not self.linkDisabled and (self.linkStart or self.autoStart and self.gotNULL)
|
|
10
|
-
|
|
11
|
-
def setAutoStart(self):
|
|
12
|
-
self.autoStart = True
|
|
13
|
-
|
|
14
|
-
def unsetAutoStart(self):
|
|
15
|
-
self.autoStart = False
|
|
16
|
-
|
|
17
|
-
def setGotNull(self):
|
|
18
|
-
self.gotNULL = True
|
|
19
|
-
|
|
20
|
-
def unsetGotNULL(self):
|
|
21
|
-
self.gotNULL = False
|
|
22
|
-
|
|
23
|
-
def setLinkDisabled(self):
|
|
24
|
-
self.linkDisabled = True
|
|
25
|
-
|
|
26
|
-
def unsetLinkDisabled(self):
|
|
27
|
-
self.linkDisabled = False
|
|
28
|
-
|
|
29
|
-
|
egse/dummy.py
DELETED
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module provides dummy implementation for classes of the Commanding chain.
|
|
3
|
-
"""
|
|
4
|
-
import logging
|
|
5
|
-
import multiprocessing
|
|
6
|
-
import pickle
|
|
7
|
-
import random
|
|
8
|
-
import sys
|
|
9
|
-
import threading
|
|
10
|
-
import time
|
|
11
|
-
from functools import partial
|
|
12
|
-
|
|
13
|
-
import click
|
|
14
|
-
import zmq
|
|
15
|
-
|
|
16
|
-
from egse.command import ClientServerCommand
|
|
17
|
-
from egse.confman import is_configuration_manager_active
|
|
18
|
-
from egse.control import ControlServer
|
|
19
|
-
from egse.control import is_control_server_active
|
|
20
|
-
from egse.decorators import dynamic_interface
|
|
21
|
-
from egse.listener import Event
|
|
22
|
-
from egse.listener import EventInterface
|
|
23
|
-
from egse.protocol import CommandProtocol
|
|
24
|
-
from egse.proxy import Proxy
|
|
25
|
-
from egse.settings import Settings
|
|
26
|
-
from egse.system import AttributeDict
|
|
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
|
-
logging.basicConfig(level=logging.DEBUG, format=Settings.LOG_FORMAT_FULL)
|
|
32
|
-
LOGGER = logging.getLogger("egse.dummy")
|
|
33
|
-
|
|
34
|
-
# Especially DummyCommand and DummyController need to be defined in a known module
|
|
35
|
-
# because those objects are pickled and when de-pickled at the clients side the class
|
|
36
|
-
# definition must be known.
|
|
37
|
-
|
|
38
|
-
# We use AttributeDict here to define the settings, because that is how the Settings.load() returns
|
|
39
|
-
# settings loaded from a YAML file.
|
|
40
|
-
|
|
41
|
-
ctrl_settings = AttributeDict(
|
|
42
|
-
{
|
|
43
|
-
'HOSTNAME': 'localhost',
|
|
44
|
-
'COMMANDING_PORT': 4443,
|
|
45
|
-
'SERVICE_PORT': 4444,
|
|
46
|
-
'MONITORING_PORT': 4445,
|
|
47
|
-
'PROTOCOL': 'tcp',
|
|
48
|
-
'TIMEOUT': 10,
|
|
49
|
-
'HK_DELAY': 1.0,
|
|
50
|
-
}
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
commands = AttributeDict(
|
|
54
|
-
{
|
|
55
|
-
'info': {
|
|
56
|
-
'description': 'Info on the Dummy Controller',
|
|
57
|
-
'response': 'handle_device_method'
|
|
58
|
-
},
|
|
59
|
-
'response': {
|
|
60
|
-
'description': 'send a command to the device and return it\'s response',
|
|
61
|
-
'device_method': 'response',
|
|
62
|
-
'cmd': '{one} {two} {fake}',
|
|
63
|
-
'response': 'handle_device_method'
|
|
64
|
-
},
|
|
65
|
-
'handle_event': {
|
|
66
|
-
'description': "Notification of an event",
|
|
67
|
-
'device_method': 'handle_event',
|
|
68
|
-
'cmd': '{event}',
|
|
69
|
-
'response': 'handle_device_method'
|
|
70
|
-
},
|
|
71
|
-
}
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
def is_dummy_cs_active():
|
|
75
|
-
return is_control_server_active(
|
|
76
|
-
endpoint=connect_address(ctrl_settings.PROTOCOL, ctrl_settings.HOSTNAME, ctrl_settings.COMMANDING_PORT)
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
class DummyCommand(ClientServerCommand):
|
|
81
|
-
pass
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
class DummyInterface:
|
|
85
|
-
@dynamic_interface
|
|
86
|
-
def info(self):
|
|
87
|
-
...
|
|
88
|
-
@dynamic_interface
|
|
89
|
-
def response(self, *args, **kwargs):
|
|
90
|
-
...
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
class DummyProxy(Proxy, DummyInterface, EventInterface):
|
|
94
|
-
def __init__(self,
|
|
95
|
-
protocol=ctrl_settings.PROTOCOL, hostname=ctrl_settings.HOSTNAME, port=ctrl_settings.COMMANDING_PORT):
|
|
96
|
-
"""
|
|
97
|
-
Args:
|
|
98
|
-
protocol: the transport protocol [default is taken from settings file]
|
|
99
|
-
hostname: location of the control server (IP address) [default is taken from settings file]
|
|
100
|
-
port: TCP port on which the control server is listening for commands [default is taken from settings file]
|
|
101
|
-
"""
|
|
102
|
-
super().__init__(connect_address(protocol, hostname, port), timeout=ctrl_settings.TIMEOUT)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
class DummyController(DummyInterface, EventInterface):
|
|
106
|
-
def __init__(self, control_server):
|
|
107
|
-
self._cs = control_server
|
|
108
|
-
|
|
109
|
-
def info(self):
|
|
110
|
-
return "method info() called on DummyController"
|
|
111
|
-
|
|
112
|
-
def response(self, *args, **kwargs):
|
|
113
|
-
return f"response({args}, {kwargs})"
|
|
114
|
-
|
|
115
|
-
def handle_event(self, event: Event) -> str:
|
|
116
|
-
|
|
117
|
-
_exec_in_thread = False
|
|
118
|
-
|
|
119
|
-
def _handle_event(event):
|
|
120
|
-
LOGGER.info(f"An event is received, {event=}")
|
|
121
|
-
LOGGER.info(f"CM CS active? {is_configuration_manager_active()}")
|
|
122
|
-
time.sleep(5.0)
|
|
123
|
-
LOGGER.info(f"CM CS active? {is_configuration_manager_active()}")
|
|
124
|
-
LOGGER.info(f"An event is processed, {event=}")
|
|
125
|
-
|
|
126
|
-
if _exec_in_thread:
|
|
127
|
-
# We execute this function in a daemon thread so the acknowledgment is
|
|
128
|
-
# sent back immediately (the ACK means 'command received and will be
|
|
129
|
-
# executed).
|
|
130
|
-
|
|
131
|
-
retry_thread = threading.Thread(target=_handle_event, args=(event,))
|
|
132
|
-
retry_thread.daemon = True
|
|
133
|
-
retry_thread.start()
|
|
134
|
-
else:
|
|
135
|
-
# An alternative to the daemon thread is to create a scheduled task that will be executed
|
|
136
|
-
# after the event is acknowledged.
|
|
137
|
-
|
|
138
|
-
self._cs.schedule_task(partial(_handle_event, event))
|
|
139
|
-
|
|
140
|
-
return "ACK"
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
class DummyProtocol(CommandProtocol):
|
|
144
|
-
|
|
145
|
-
def __init__(self, control_server: ControlServer):
|
|
146
|
-
super().__init__()
|
|
147
|
-
self.control_server = control_server
|
|
148
|
-
|
|
149
|
-
self.device_controller = DummyController(control_server)
|
|
150
|
-
|
|
151
|
-
self.load_commands(commands, DummyCommand, DummyController)
|
|
152
|
-
|
|
153
|
-
self.build_device_method_lookup_table(self.device_controller)
|
|
154
|
-
|
|
155
|
-
self._count = 0
|
|
156
|
-
|
|
157
|
-
def get_bind_address(self):
|
|
158
|
-
return bind_address(self.control_server.get_communication_protocol(), self.control_server.get_commanding_port())
|
|
159
|
-
|
|
160
|
-
def get_status(self):
|
|
161
|
-
return super().get_status()
|
|
162
|
-
|
|
163
|
-
def get_housekeeping(self) -> dict:
|
|
164
|
-
|
|
165
|
-
# LOGGER.debug(f"Executing get_housekeeping function for {self.__class__.__name__}.")
|
|
166
|
-
|
|
167
|
-
self._count += 1
|
|
168
|
-
|
|
169
|
-
# use the sleep to test the responsiveness of the control server when even this get_housekeeping function takes
|
|
170
|
-
# a lot of time, i.e. up to several minutes in the case of data acquisition devices
|
|
171
|
-
# import time
|
|
172
|
-
# time.sleep(2.0)
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
return {
|
|
176
|
-
'timestamp': format_datetime(),
|
|
177
|
-
'COUNT': self._count,
|
|
178
|
-
'PI': 3.14159, # just to have a constant parameter
|
|
179
|
-
'Random': random.randint(0, 100), # just to have a variable parameter
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
class DummyControlServer(ControlServer):
|
|
184
|
-
"""
|
|
185
|
-
DummyControlServer - Command and monitor dummy device controllers.
|
|
186
|
-
|
|
187
|
-
The sever binds to the following ZeroMQ sockets:
|
|
188
|
-
|
|
189
|
-
* a REQ-REP socket that can be used as a command server. Any client can connect and
|
|
190
|
-
send a command to the dummy device controller.
|
|
191
|
-
|
|
192
|
-
* a PUB-SUP socket that serves as a monitoring server. It will send out status
|
|
193
|
-
information to all the connected clients every DELAY seconds.
|
|
194
|
-
|
|
195
|
-
"""
|
|
196
|
-
|
|
197
|
-
def __init__(self):
|
|
198
|
-
multiprocessing.current_process().name = "dummy_cs"
|
|
199
|
-
|
|
200
|
-
super().__init__()
|
|
201
|
-
|
|
202
|
-
self.device_protocol = DummyProtocol(self)
|
|
203
|
-
|
|
204
|
-
self.logger.info(f"Binding ZeroMQ socket to {self.device_protocol.get_bind_address()}")
|
|
205
|
-
|
|
206
|
-
self.device_protocol.bind(self.dev_ctrl_cmd_sock)
|
|
207
|
-
|
|
208
|
-
self.poller.register(self.dev_ctrl_cmd_sock, zmq.POLLIN)
|
|
209
|
-
|
|
210
|
-
self.set_hk_delay(ctrl_settings.HK_DELAY)
|
|
211
|
-
|
|
212
|
-
from egse.confman import ConfigurationManagerProxy
|
|
213
|
-
from egse.listener import EVENT_ID
|
|
214
|
-
|
|
215
|
-
self.register_as_listener(
|
|
216
|
-
proxy=ConfigurationManagerProxy,
|
|
217
|
-
listener={'name': 'Dummy CS', 'proxy': DummyProxy, 'event_id': EVENT_ID.SETUP}
|
|
218
|
-
)
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
def get_communication_protocol(self):
|
|
222
|
-
return 'tcp'
|
|
223
|
-
|
|
224
|
-
def get_commanding_port(self):
|
|
225
|
-
return ctrl_settings.COMMANDING_PORT
|
|
226
|
-
|
|
227
|
-
def get_service_port(self):
|
|
228
|
-
return ctrl_settings.SERVICE_PORT
|
|
229
|
-
|
|
230
|
-
def get_monitoring_port(self):
|
|
231
|
-
return ctrl_settings.MONITORING_PORT
|
|
232
|
-
|
|
233
|
-
def get_storage_mnemonic(self):
|
|
234
|
-
return "DUMMY-HK"
|
|
235
|
-
|
|
236
|
-
def after_serve(self):
|
|
237
|
-
from egse.confman import ConfigurationManagerProxy
|
|
238
|
-
|
|
239
|
-
self.unregister_as_listener(proxy=ConfigurationManagerProxy, listener={'name': 'Dummy CS'})
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
@click.group()
|
|
243
|
-
def cli():
|
|
244
|
-
pass
|
|
245
|
-
|
|
246
|
-
@click.group()
|
|
247
|
-
def control_server():
|
|
248
|
-
pass
|
|
249
|
-
|
|
250
|
-
cli.add_command(control_server)
|
|
251
|
-
|
|
252
|
-
@control_server.command()
|
|
253
|
-
def start():
|
|
254
|
-
"""Start the dummy control server on localhost."""
|
|
255
|
-
from egse.dummy import DummyControlServer
|
|
256
|
-
|
|
257
|
-
try:
|
|
258
|
-
control_server = DummyControlServer()
|
|
259
|
-
control_server.serve()
|
|
260
|
-
except KeyboardInterrupt:
|
|
261
|
-
print("Shutdown requested...exiting")
|
|
262
|
-
except SystemExit as exit_code:
|
|
263
|
-
print("System Exit with code {}.".format(exit_code))
|
|
264
|
-
sys.exit(exit_code)
|
|
265
|
-
except Exception:
|
|
266
|
-
import traceback
|
|
267
|
-
traceback.print_exc(file=sys.stdout)
|
|
268
|
-
|
|
269
|
-
@control_server.command()
|
|
270
|
-
def stop():
|
|
271
|
-
"""Send a quit service command to the dummy control server."""
|
|
272
|
-
with DummyProxy() as dummy:
|
|
273
|
-
sp = dummy.get_service_proxy()
|
|
274
|
-
sp.quit_server()
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
@cli.command()
|
|
278
|
-
@click.argument('hostname')
|
|
279
|
-
@click.argument('port')
|
|
280
|
-
@click.option('--pickle/--no-pickle', 'use_pickle', default=True)
|
|
281
|
-
def monitoring(use_pickle: bool, hostname: str = 'localhost', port: int = None):
|
|
282
|
-
"""Monitor the status of a control server on hostname.
|
|
283
|
-
|
|
284
|
-
The port number shall correspond to the port number on which the server is publishing
|
|
285
|
-
information with the ZeroMQ PUB-SUB protocol.
|
|
286
|
-
|
|
287
|
-
The response from the server (the data or string that was published) is logged at INFO level.
|
|
288
|
-
|
|
289
|
-
Arguments:
|
|
290
|
-
|
|
291
|
-
hostname: the IP address or hostname of the server
|
|
292
|
-
|
|
293
|
-
port: the port to connect to (this is the port to which the server binds)
|
|
294
|
-
|
|
295
|
-
Options:
|
|
296
|
-
|
|
297
|
-
--pickle or --no-pickle: use pickle to de-serialize the response
|
|
298
|
-
"""
|
|
299
|
-
context = zmq.Context()
|
|
300
|
-
|
|
301
|
-
receiver = context.socket(zmq.SUB)
|
|
302
|
-
receiver.connect(f"tcp://{hostname}:{port}")
|
|
303
|
-
receiver.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
304
|
-
|
|
305
|
-
while True:
|
|
306
|
-
try:
|
|
307
|
-
response = receiver.recv()
|
|
308
|
-
if use_pickle:
|
|
309
|
-
response = pickle.loads(response)
|
|
310
|
-
|
|
311
|
-
LOGGER.info(response)
|
|
312
|
-
except KeyboardInterrupt:
|
|
313
|
-
LOGGER.info("KeyboardInterrupt caught!")
|
|
314
|
-
break
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
if __name__ == "__main__":
|
|
318
|
-
cli()
|