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/esl.py
DELETED
|
@@ -1,630 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module provides Python wrapper functions to (most of) the library functions from
|
|
3
|
-
the C library `EtherSpaceLink.c`.
|
|
4
|
-
|
|
5
|
-
Basic Usage
|
|
6
|
-
|
|
7
|
-
For accessing the EtherSpaceLink interface, use the context manager to get an ESL connection:
|
|
8
|
-
|
|
9
|
-
with esl_connection(dsi_address) as esl_link:
|
|
10
|
-
# do your configuration and commanding here
|
|
11
|
-
|
|
12
|
-
For special cases it might be useful to open and close the ESL connection yourself. Be careful
|
|
13
|
-
however to close the connection with every exception that is thrown.
|
|
14
|
-
|
|
15
|
-
try:
|
|
16
|
-
esl_link = esl_open_connection(dsi_address)
|
|
17
|
-
# do your configuration and commanding
|
|
18
|
-
finally:
|
|
19
|
-
if esl_link:
|
|
20
|
-
esl_close_connection(esl_link)
|
|
21
|
-
|
|
22
|
-
It should be clear that using the context manager is preferred and should be considered the normal usage.
|
|
23
|
-
|
|
24
|
-
We use one single Exception (`ESLError`) specific for these wrapper functions.
|
|
25
|
-
An `ESLError` is thrown whenever the C function returns an error from which we can not recover.
|
|
26
|
-
This allows to cascade the python functions in a `try: except:` clause making
|
|
27
|
-
the code much more readable.
|
|
28
|
-
|
|
29
|
-
Developer Info
|
|
30
|
-
|
|
31
|
-
The C interface depends heavily on a C structure which we had to re-define using
|
|
32
|
-
the Structure class provided by ctypes.
|
|
33
|
-
|
|
34
|
-
"""
|
|
35
|
-
import ctypes
|
|
36
|
-
import logging
|
|
37
|
-
import time
|
|
38
|
-
import typing
|
|
39
|
-
from contextlib import contextmanager
|
|
40
|
-
from ctypes import c_char_p
|
|
41
|
-
from ctypes import c_int
|
|
42
|
-
from typing import Tuple
|
|
43
|
-
|
|
44
|
-
import egse
|
|
45
|
-
from egse.dsi import constants
|
|
46
|
-
from egse.dsi.constants import esl_error_codes
|
|
47
|
-
from egse.dsi.constants import esl_extension_codes
|
|
48
|
-
from egse.dsi.constants import esl_link_mode
|
|
49
|
-
from egse.dsi.constants import esl_terminator_codes
|
|
50
|
-
from egse.settings import Settings
|
|
51
|
-
|
|
52
|
-
if typing.TYPE_CHECKING:
|
|
53
|
-
from egse.dsi._libesl import ESL
|
|
54
|
-
|
|
55
|
-
logger = logging.getLogger(__name__)
|
|
56
|
-
|
|
57
|
-
dsi_settings = Settings.load("DSI")
|
|
58
|
-
|
|
59
|
-
# Create and initialize a memory buffer for transmissions
|
|
60
|
-
|
|
61
|
-
rx_buffer = ctypes.create_string_buffer(dsi_settings.RX_BUFFER_LENGTH)
|
|
62
|
-
tx_buffer = ctypes.create_string_buffer(dsi_settings.TX_BUFFER_LENGTH)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
class ESLError(Exception):
|
|
66
|
-
pass
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
def esl_read_packet(esl_link: 'ESL', timeout: int = None) -> Tuple[int, bytes]:
|
|
70
|
-
"""
|
|
71
|
-
Reads a full packet from the SpaceWire link.
|
|
72
|
-
|
|
73
|
-
.. note:: since this function returns a packet as a bytes object, the content of the packet can not be changed.
|
|
74
|
-
|
|
75
|
-
Args:
|
|
76
|
-
esl_link (ESL): the ESL structure that defines the connection to the DSI
|
|
77
|
-
timeout (int): the maximum timeout that read_packet() will wait for data before returning [milliseconds]
|
|
78
|
-
|
|
79
|
-
Returns:
|
|
80
|
-
A tuple with the terminator value and a bytes object containing the packet.
|
|
81
|
-
When an error occurred, the first value in the tuple will be negative and contains the error number,
|
|
82
|
-
the second item in the tuple will then be an empty buffer.
|
|
83
|
-
|
|
84
|
-
"""
|
|
85
|
-
terminator = c_int(0)
|
|
86
|
-
terminator_p = ctypes.pointer(terminator)
|
|
87
|
-
|
|
88
|
-
bytes_received = esl_read_packet_full(
|
|
89
|
-
esl_link, rx_buffer, dsi_settings.RX_BUFFER_LENGTH, terminator_p,
|
|
90
|
-
constants.ESL_RETURN_EXTENSION_DATA | constants.ESL_RETURN_SPECIAL_DATA, timeout=timeout)
|
|
91
|
-
|
|
92
|
-
# logger.debug(f"Number of bytes received: {bytes_received}")
|
|
93
|
-
|
|
94
|
-
if bytes_received < 0:
|
|
95
|
-
return bytes_received, bytes()
|
|
96
|
-
|
|
97
|
-
return terminator.value, rx_buffer[:bytes_received]
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
@contextmanager
|
|
101
|
-
def esl_connection(dsi_address: str) -> 'ESL':
|
|
102
|
-
"""
|
|
103
|
-
Context Manager that opens a EtherSpaceLink connection with the DSI (Diagnostic SpaceWire Interface).
|
|
104
|
-
|
|
105
|
-
Args:
|
|
106
|
-
dsi_address (str): the IP address of the DSI
|
|
107
|
-
|
|
108
|
-
Returns:
|
|
109
|
-
a pointer to the ESL structure
|
|
110
|
-
"""
|
|
111
|
-
esl_link = None
|
|
112
|
-
try:
|
|
113
|
-
esl_link = esl_open_connection(dsi_address)
|
|
114
|
-
yield esl_link
|
|
115
|
-
finally:
|
|
116
|
-
if esl_link:
|
|
117
|
-
esl_close_connection(esl_link)
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
def esl_open_connection(dsi_address: str) -> 'ESL':
|
|
121
|
-
"""
|
|
122
|
-
Open a connection to the EtherSpaceLink DSI on the given IP address.
|
|
123
|
-
This function will keep trying to connect for 10 seconds before aborting
|
|
124
|
-
and throwing an `ESLError`.
|
|
125
|
-
|
|
126
|
-
Args:
|
|
127
|
-
dsi_address (str): the IP address of the DSI
|
|
128
|
-
|
|
129
|
-
Returns:
|
|
130
|
-
a pointer to the ESL structure
|
|
131
|
-
|
|
132
|
-
"""
|
|
133
|
-
logger.info(f"Open and setup EtherSpaceLink connection on {dsi_address}.")
|
|
134
|
-
|
|
135
|
-
retry = 20 # number of retries before failing to open connection
|
|
136
|
-
esl_link = None
|
|
137
|
-
|
|
138
|
-
while retry:
|
|
139
|
-
esl_link = egse.dsi._libesl.libesl_open(c_char_p(dsi_address.encode()))
|
|
140
|
-
if esl_link:
|
|
141
|
-
break
|
|
142
|
-
else:
|
|
143
|
-
time.sleep(0.5) # wait half a second before trying again
|
|
144
|
-
logger.info(f"Trying to connect to {dsi_address}, {retry / 2.0} sec before shutdown.")
|
|
145
|
-
retry -= 1
|
|
146
|
-
|
|
147
|
-
if not esl_link:
|
|
148
|
-
raise ESLError(f"Couldn't open connection to DSI on {dsi_address}.")
|
|
149
|
-
|
|
150
|
-
logger.info(f"EtherSpaceLink connection to {dsi_address} opened successfully.")
|
|
151
|
-
|
|
152
|
-
return esl_link
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
def esl_close_connection(esl_link):
|
|
156
|
-
"""
|
|
157
|
-
Close the connection to the EtherSpaceLink DSI.
|
|
158
|
-
|
|
159
|
-
This also flushes and closes the log and record files if they were used.
|
|
160
|
-
|
|
161
|
-
Args:
|
|
162
|
-
esl_link (ESL): the ESL structure that defines the connection to the DSI
|
|
163
|
-
|
|
164
|
-
Returns:
|
|
165
|
-
Nothing
|
|
166
|
-
"""
|
|
167
|
-
egse.dsi._libesl.libesl_close(esl_link)
|
|
168
|
-
logger.info("EtherSpaceLink connection closed successfully.")
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
def esl_flush(esl_link) -> int:
|
|
172
|
-
"""
|
|
173
|
-
Flush all outstanding data to the destination. This function puts queued data onto the wire.
|
|
174
|
-
|
|
175
|
-
Args:
|
|
176
|
-
esl_link (ESL): the ESL structure that defines the connection to the DSI
|
|
177
|
-
|
|
178
|
-
Returns:
|
|
179
|
-
0 on success, !0 otherwise
|
|
180
|
-
"""
|
|
181
|
-
result = egse.dsi._libesl.libesl_flush(esl_link)
|
|
182
|
-
# We don't want this to raise an exception, the result value should be checked by the caller instead.
|
|
183
|
-
# if result:
|
|
184
|
-
# raise ESLError(
|
|
185
|
-
# f"Could not flush/send transmit buffer, "
|
|
186
|
-
# f"ESL error code={esl_error_codes[esl_link.contents.ESL_error]} [{esl_link.contents.ESL_error}]"
|
|
187
|
-
# )
|
|
188
|
-
return result
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
def esl_configure(esl_link: 'ESL',
|
|
192
|
-
active_link: int = 1, speed: int = 50, mode: int = constants.ESL_LINK_MODE_NORMAL,
|
|
193
|
-
report: int = 0):
|
|
194
|
-
"""
|
|
195
|
-
Configure the `esl_link` EtherSpaceWire link to the DSI.
|
|
196
|
-
|
|
197
|
-
The reporting parameter is used to enable reporting for the following events:
|
|
198
|
-
|
|
199
|
-
ESL_ER_REPORT_PARITY_ERROR
|
|
200
|
-
ESL_ER_REPORT_TIME_CODE
|
|
201
|
-
ESL_ER_REPORT_ESC_EOP
|
|
202
|
-
ESL_ER_REPORT_ESC_EEP
|
|
203
|
-
ESL_ER_REPORT_ESC_ESC
|
|
204
|
-
ESL_ER_REPORT_TIMEOUT
|
|
205
|
-
|
|
206
|
-
Args:
|
|
207
|
-
esl_link (ESL): the ESL structure that defines the connection to the DSI
|
|
208
|
-
active_link: the port number on the DSI where the SpW link shall be activated (default=1)
|
|
209
|
-
speed: the speed in Mbps
|
|
210
|
-
mode: the link mode [DISABLED, NORMAL, LEGACY or MASTER]
|
|
211
|
-
report: enable reporting [default=0]
|
|
212
|
-
|
|
213
|
-
Returns:
|
|
214
|
-
Nothing
|
|
215
|
-
"""
|
|
216
|
-
status = esl_set_active_link(esl_link, active_link)
|
|
217
|
-
logger.info(f"esl_set_active_link({active_link}) -> {status = }")
|
|
218
|
-
status = esl_set_speed(esl_link, speed)
|
|
219
|
-
logger.info(f"esl_set_speed({speed}) -> {status = }")
|
|
220
|
-
|
|
221
|
-
if report:
|
|
222
|
-
status = esl_er_enable_reporting(esl_link, report)
|
|
223
|
-
logger.info(f"esl_er_enable_reporting(0b{report:b}) -> {status = }")
|
|
224
|
-
|
|
225
|
-
status = esl_set_mode(esl_link, mode)
|
|
226
|
-
logger.info(f"esl_set_mode({esl_link_mode[mode]}={mode}) -> {status = }")
|
|
227
|
-
|
|
228
|
-
status = esl_flush(esl_link)
|
|
229
|
-
logger.info(f"esl_flush() -> {status = }")
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
def esl_set_active_link(esl_link, active_link):
|
|
233
|
-
return egse.dsi._libesl.libesl_set_active_link(esl_link, active_link)
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
def esl_get_active_link(esl_link):
|
|
237
|
-
return esl_link.contents.current_port
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
def esl_is_link_connected(esl_link):
|
|
241
|
-
return egse.dsi._libesl.libesl_link_connected(esl_link)
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
def esl_set_speed(esl_link, speed):
|
|
245
|
-
result = egse.dsi._libesl.libesl_set_speed(esl_link, speed)
|
|
246
|
-
if result:
|
|
247
|
-
raise ESLError("Could not set speed to {}, ESL error code={} [{}]".format(speed, esl_error_codes[
|
|
248
|
-
esl_link.contents.ESL_error], esl_link.contents.ESL_error))
|
|
249
|
-
return result
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
def esl_set_mode(esl_link: 'ESL', mode: int) -> int:
|
|
253
|
-
"""
|
|
254
|
-
Set the operating mode of the currently active SpaceWire link.
|
|
255
|
-
|
|
256
|
-
After opening a connection, the link is disabled; it must then
|
|
257
|
-
be enabled into one of its operational modes before data can
|
|
258
|
-
be transferred.
|
|
259
|
-
|
|
260
|
-
Args:
|
|
261
|
-
esl_link (ESL): the ESL structure that defines the connection to the DSI
|
|
262
|
-
mode (int): the link mode [DISABLED, NORMAL, LEGACY or MASTER]
|
|
263
|
-
|
|
264
|
-
Returns:
|
|
265
|
-
0 if the request has been queued, not 0 if not.
|
|
266
|
-
|
|
267
|
-
"""
|
|
268
|
-
result = egse.dsi._libesl.libesl_set_mode(esl_link, mode)
|
|
269
|
-
if result:
|
|
270
|
-
raise ESLError(f"Could not set mode {esl_link_mode[mode]}.")
|
|
271
|
-
|
|
272
|
-
return result
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
def esl_send_timecode(esl_link: 'ESL', timecode: int) -> int:
|
|
276
|
-
"""
|
|
277
|
-
Send a timecode over the SpaceWire link.
|
|
278
|
-
|
|
279
|
-
The 8-bit timecode argument contains six-bit of system time (time-field) and two control flags.
|
|
280
|
-
|
|
281
|
-
Args:
|
|
282
|
-
esl_link (ESL): the ESL structure that defines the connection to the DSI
|
|
283
|
-
timecode (int): an 8-bit timecode field
|
|
284
|
-
|
|
285
|
-
Returns:
|
|
286
|
-
0 if the request has been queued, not 0 if not.
|
|
287
|
-
|
|
288
|
-
"""
|
|
289
|
-
result = egse.dsi._libesl.libesl_send_timecode(esl_link, timecode)
|
|
290
|
-
|
|
291
|
-
if result:
|
|
292
|
-
raise ESLError(
|
|
293
|
-
f"Could not send timecode, ESL error code={esl_error_codes[esl_link.contents.ESL_error]} "
|
|
294
|
-
f"[{esl_link.contents.ESL_error}]"
|
|
295
|
-
)
|
|
296
|
-
|
|
297
|
-
result = egse.dsi._libesl.libesl_flush(esl_link)
|
|
298
|
-
|
|
299
|
-
return result
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
def esl_get_rx_timeout(esl_link):
|
|
303
|
-
return esl_link.contents.rx_timeout
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
def esl_set_rx_timeout(esl_link, timeout: int):
|
|
307
|
-
esl_link.contents.rx_timeout = timeout
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
def esl_get_receive_speed(esl_link: 'ESL') -> int:
|
|
311
|
-
"""
|
|
312
|
-
Gets the receive speed of the currently active link.
|
|
313
|
-
|
|
314
|
-
Note that this function has the ability to cause frames to be dropped and the esl_request_rx_speed() function
|
|
315
|
-
should be used instead.
|
|
316
|
-
|
|
317
|
-
Args:
|
|
318
|
-
esl_link (ESL): the ESL structure that defines the connection to the DSI
|
|
319
|
-
|
|
320
|
-
Returns:
|
|
321
|
-
the speed of the active link in Mbits/s. In case of an error a value < 0 will be returned.
|
|
322
|
-
"""
|
|
323
|
-
return egse.dsi._libesl.libesl_get_receive_speed(esl_link)
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
def esl_set_log_file(esl_link, filename):
|
|
327
|
-
result = egse.dsi._libesl.libesl_set_log_file(esl_link, c_char_p(filename.encode()))
|
|
328
|
-
if result:
|
|
329
|
-
raise ESLError(f"Could not write to or open log file {filename}.")
|
|
330
|
-
return result
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
def esl_set_record_file(esl_link, filename):
|
|
334
|
-
result = egse.dsi._libesl.libesl_set_record_file(esl_link, c_char_p(filename.encode()))
|
|
335
|
-
if result:
|
|
336
|
-
raise ESLError(f"Could not write to or open record file {filename}.")
|
|
337
|
-
return result
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
def esl_get_manufacturer_string(esl_link):
|
|
341
|
-
return egse.dsi._libesl.libesl_get_manufacturer_string(esl_link).decode()
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
def esl_get_product_string(esl_link):
|
|
345
|
-
return egse.dsi._libesl.libesl_get_product_string(esl_link).decode()
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
def esl_get_esl_error(esl_link):
|
|
349
|
-
return egse.dsi._libesl.libesl_get_esl_error(esl_link)
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
def esl_get_hwa(esl_link):
|
|
353
|
-
hwa = b'012345' # Pre-allocate the character buffer
|
|
354
|
-
egse.dsi._libesl.libesl_get_hwa(esl_link, hwa)
|
|
355
|
-
return hwa
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
def esl_get_serial_number(esl_link):
|
|
359
|
-
hwa = esl_get_hwa(esl_link)
|
|
360
|
-
return egse.dsi._libesl.libesl_hwa_to_serial_number_string(hwa)
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
def esl_get_number_of_links(esl_link):
|
|
364
|
-
return egse.dsi._libesl.libesl_get_number_of_links(esl_link)
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
def esl_read_packet_full(esl_link, buffer, buffer_length, rx_terminator, special_data_action, timeout: int = None):
|
|
368
|
-
|
|
369
|
-
if timeout:
|
|
370
|
-
saved_timeout = esl_get_rx_timeout(esl_link)
|
|
371
|
-
egse.dsi._libesl.libesl_set_rx_timeout(esl_link, timeout)
|
|
372
|
-
|
|
373
|
-
result = egse.dsi._libesl.libesl_read_packet_full(esl_link, buffer, buffer_length, rx_terminator, special_data_action)
|
|
374
|
-
|
|
375
|
-
if timeout:
|
|
376
|
-
egse.dsi._libesl.libesl_set_rx_timeout(esl_link, saved_timeout)
|
|
377
|
-
|
|
378
|
-
# This error handling is (or should be) done in the calling application, see for example egse.feesim.py
|
|
379
|
-
# if result == -1:
|
|
380
|
-
# raise ESLError(
|
|
381
|
-
# f"Could not read full packet, "
|
|
382
|
-
# f"ESL error code = {esl_error_codes[esl_link.contents.ESL_error]} [{esl_link.contents.ESL_error}]"
|
|
383
|
-
# )
|
|
384
|
-
|
|
385
|
-
return result
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
def esl_write_packet(esl_link: 'ESL', buffer, buffer_length: int, tx_terminator: int) -> int:
|
|
389
|
-
"""
|
|
390
|
-
Queue data for transmission over the SpaceWire cable. If there is no room left in the buffer,
|
|
391
|
-
the buffer is transmitted.
|
|
392
|
-
|
|
393
|
-
Note, that even when the queued data is transmitted, the data added to it may not be.
|
|
394
|
-
To guarantee transmission of this data you need to call the esl_flush() function.
|
|
395
|
-
|
|
396
|
-
Args:
|
|
397
|
-
esl_link (ESL): the ESL structure that defines the connection to the DSI
|
|
398
|
-
buffer: the data to send
|
|
399
|
-
buffer_length: the size of the buffer to send (the actual buffer size might be longer)
|
|
400
|
-
tx_terminator: additional metadata about the frame we are transmitting (EOP, EEP, PART_EOP_EEP, EXTN)
|
|
401
|
-
|
|
402
|
-
Returns:
|
|
403
|
-
return_code: 0 on success, < 0 when an error occurred.
|
|
404
|
-
"""
|
|
405
|
-
|
|
406
|
-
result = egse.dsi._libesl.libesl_write_packet(esl_link, buffer, buffer_length, tx_terminator)
|
|
407
|
-
|
|
408
|
-
return result
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
def esl_er_enable_reporting(esl_link, flags):
|
|
412
|
-
result = egse.dsi._libesl.libesl_er_enable_reporting(esl_link, flags)
|
|
413
|
-
if result:
|
|
414
|
-
raise ESLError(
|
|
415
|
-
f"Could not enable error reporting, "
|
|
416
|
-
f"ESL error code = {esl_error_codes[esl_link.contents.ESL_error]} [{esl_link.contents.ESL_error}]"
|
|
417
|
-
)
|
|
418
|
-
return result
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
def esl_print_info(esl_link: 'ESL') -> None:
|
|
422
|
-
"""
|
|
423
|
-
Prints information about the connected device to the console.
|
|
424
|
-
|
|
425
|
-
Args:
|
|
426
|
-
esl_link (ESL): the ESL structure that defines the connection to the DSI
|
|
427
|
-
|
|
428
|
-
Returns:
|
|
429
|
-
nothing
|
|
430
|
-
"""
|
|
431
|
-
print(f"Manufacturer {esl_get_manufacturer_string(esl_link)}")
|
|
432
|
-
print(f"Product {esl_get_product_string(esl_link)}")
|
|
433
|
-
print(f"Number of links {esl_get_number_of_links(esl_link)} [active port={esl_get_active_link(esl_link)}]")
|
|
434
|
-
|
|
435
|
-
hwa = esl_get_hwa(esl_link)
|
|
436
|
-
serial_number = esl_get_serial_number(esl_link)
|
|
437
|
-
|
|
438
|
-
print(f"Serial number {serial_number}")
|
|
439
|
-
print(f"Hardware Address 0x{hwa[0]:02X}-{hwa[1]:02X}-{hwa[2]:02X}-{hwa[3]:02X}-{hwa[4]:02X}-{hwa[5]:02X}")
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
def esl_print_summary_of_structure(esl):
|
|
443
|
-
print("EtherSpaceLink structure:")
|
|
444
|
-
print("sock {}".format(esl.contents.sock))
|
|
445
|
-
print("tx_buffer_length {}".format(esl.contents.tx_buffer_length))
|
|
446
|
-
print("tx_buffer_content {}".format(esl.contents.tx_buffer_content))
|
|
447
|
-
print("rx_buffer_length {}".format(esl.contents.rx_buffer_length))
|
|
448
|
-
print("rx_buffer_content {}".format(esl.contents.rx_buffer_content))
|
|
449
|
-
print("rx_state {}".format(esl.contents.rx_state))
|
|
450
|
-
print("rx_count {}".format(esl.contents.rx_count))
|
|
451
|
-
print("rx_param {}".format(esl.contents.rx_param))
|
|
452
|
-
#print("rx_size {}".format(esl.contents.rx_size))
|
|
453
|
-
print("rx_timeout {}".format(esl.contents.rx_timeout))
|
|
454
|
-
#print("rx_final_terminator {}".format(esl.contents.rx_final_terminator))
|
|
455
|
-
print("extn_count {}".format(esl.contents.extn_count))
|
|
456
|
-
print("number_of_slots {}".format(esl.contents.number_of_slots))
|
|
457
|
-
#print("id {}".format(esl.contents.id))
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
# Helper Functions ---------------------------------------------------------------------------------
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
def is_terminator_code(code):
|
|
464
|
-
return True if code in esl_terminator_codes else False
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
def get_terminator_name(code):
|
|
468
|
-
if code in esl_terminator_codes:
|
|
469
|
-
return esl_terminator_codes[code]
|
|
470
|
-
else:
|
|
471
|
-
return None
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
def is_extension_code(code):
|
|
475
|
-
return True if code in esl_extension_codes else False
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
def get_extension_name(code):
|
|
479
|
-
if code in esl_extension_codes:
|
|
480
|
-
return esl_extension_codes[code]
|
|
481
|
-
else:
|
|
482
|
-
return None
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
def get_protocol_id(packet) -> int:
|
|
486
|
-
if isinstance(packet[1], bytes):
|
|
487
|
-
value = int.from_bytes(packet[1], byteorder='big')
|
|
488
|
-
else:
|
|
489
|
-
value = packet[1] # value assumed to be of type 'int'
|
|
490
|
-
return value
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
def is_timecode(packet) -> bool:
|
|
494
|
-
"""Returns True if the packet is a timecode reported as an extension from the DSI."""
|
|
495
|
-
return packet[0] == 0x91
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
RMAP_PROTOCOL_ID = 0x01
|
|
499
|
-
CCSDS_PROTOCOL_ID = 0x02
|
|
500
|
-
DATA_HK_PROTOCOL_ID = 0xF0
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
def pretty_print_read_request_packet(packet):
|
|
504
|
-
msg = (
|
|
505
|
-
f"RMAP Read Request ({len(packet)} bytes)\n"
|
|
506
|
-
f"Logical address: 0x{packet[0]:0x}\n"
|
|
507
|
-
f"Protocol ID: 0x{packet[1]:0x}\n"
|
|
508
|
-
f"Instruction: 0x{packet[2]:0x}\n"
|
|
509
|
-
f"Key: 0x{packet[3]:0x}\n"
|
|
510
|
-
f"Initiator address: 0x{packet[4]:0x}\n"
|
|
511
|
-
f"Transaction ID: 0x{packet[5:7].hex()}\n"
|
|
512
|
-
f"Extended address: 0x{packet[7]:0x}\n"
|
|
513
|
-
f"Address Field: 0x{packet[8:12].hex()}\n"
|
|
514
|
-
f"Data Length: 0x{packet[12:15].hex()}\n"
|
|
515
|
-
f"Header CRC: 0x{packet[15]:0x}\n"
|
|
516
|
-
)
|
|
517
|
-
return msg
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
def pretty_print_read_request_reply_packet(packet):
|
|
521
|
-
data_length = int.from_bytes(packet[8:11], byteorder='big')
|
|
522
|
-
msg = (
|
|
523
|
-
f"RMAP Read Request Reply ({len(packet)} bytes)\n"
|
|
524
|
-
f"Logical address: 0x{packet[0]:0x}\n"
|
|
525
|
-
f"Protocol ID: 0x{packet[1]:0x}\n"
|
|
526
|
-
f"Instruction: 0x{packet[2]:0x}\n"
|
|
527
|
-
f"Status: 0x{packet[3]:0x}\n"
|
|
528
|
-
f"Target address: 0x{packet[4]:0x}\n"
|
|
529
|
-
f"Transaction ID: 0x{packet[5:7].hex()}\n"
|
|
530
|
-
f"Reserved: 0x{packet[7]:0x}\n"
|
|
531
|
-
f"Data Length: {data_length}\n"
|
|
532
|
-
f"Header CRC: 0x{packet[11]:0x}\n"
|
|
533
|
-
f"data: 0x{packet[12:12 + min(32, data_length)].hex()}\n"
|
|
534
|
-
f" note: maximum 32 bytes will be printed for the data.\n"
|
|
535
|
-
f"Data CRC: 0x{packet[-1]:0x}\n"
|
|
536
|
-
)
|
|
537
|
-
return msg
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
def pretty_print_write_request_reply_packet(packet):
|
|
541
|
-
data_length = int.from_bytes(packet[8:11], byteorder='big')
|
|
542
|
-
msg = (
|
|
543
|
-
f"RMAP Write Request Reply ({len(packet)} bytes)\n"
|
|
544
|
-
f"Logical address: 0x{packet[0]:0x}\n"
|
|
545
|
-
f"Protocol ID: 0x{packet[1]:0x}\n"
|
|
546
|
-
f"Instruction: 0x{packet[2]:0x}\n"
|
|
547
|
-
f"Status: 0x{packet[3]:0x}\n"
|
|
548
|
-
f"Target address: 0x{packet[4]:0x}\n"
|
|
549
|
-
f"Transaction ID: 0x{packet[5:7].hex()}\n"
|
|
550
|
-
f"Header CRC: 0x{packet[7]:0x}\n"
|
|
551
|
-
)
|
|
552
|
-
return msg
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
def pretty_print_verified_write_request_packet(packet):
|
|
556
|
-
msg = (
|
|
557
|
-
f"RMAP Verified Write Request ({len(packet)} bytes)\n"
|
|
558
|
-
f"Logical address: 0x{packet[0]:02x}\n"
|
|
559
|
-
f"Protocol ID: 0x{packet[1]:02x}\n"
|
|
560
|
-
f"Instruction: 0x{packet[2]:02x}\n"
|
|
561
|
-
f"Key: 0x{packet[3]:02x}\n"
|
|
562
|
-
f"Initiator address: 0x{packet[4]:02x}\n"
|
|
563
|
-
f"Transaction ID: 0x{packet[5:7].hex()}\n"
|
|
564
|
-
f"Address: 0x{packet[7:12].hex()}\n"
|
|
565
|
-
f"Data Length: 0x04\n"
|
|
566
|
-
f"Header CRC: 0x{packet[15]:02x}\n"
|
|
567
|
-
f"data: 0x{packet[16:20].hex()}\n"
|
|
568
|
-
f"Data CRC: 0x{packet[20]:02x}\n"
|
|
569
|
-
)
|
|
570
|
-
return msg
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
def pretty_print_unverified_write_request_packet(packet):
|
|
574
|
-
data_length = int.from_bytes(packet[12:15], byteorder='big')
|
|
575
|
-
msg = (
|
|
576
|
-
f"RMAP Unverified Write Request ({len(packet)} bytes)\n"
|
|
577
|
-
f"Logical address: 0x{packet[0]:02x}\n"
|
|
578
|
-
f"Protocol ID: 0x{packet[1]:02x}\n"
|
|
579
|
-
f"Instruction: 0x{packet[2]:02x}\n"
|
|
580
|
-
f"Key: 0x{packet[3]:02x}\n"
|
|
581
|
-
f"Initiator address: 0x{packet[4]:02x}\n"
|
|
582
|
-
f"Transaction ID: 0x{packet[5:7].hex()}\n"
|
|
583
|
-
f"Address: 0x{packet[7:12].hex()}\n"
|
|
584
|
-
f"Data Length: {data_length}\n"
|
|
585
|
-
f"Header CRC: 0x{packet[15]:02x}\n"
|
|
586
|
-
f"data: {packet[16:16 + min(32, data_length)]}\n"
|
|
587
|
-
f" note: maximum 32 bytes will be printed for the data.\n"
|
|
588
|
-
f"Data CRC: 0x{packet[-1]:0x}\n"
|
|
589
|
-
)
|
|
590
|
-
return msg
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
def pp_packet(packet) -> str:
|
|
594
|
-
"""
|
|
595
|
-
Returns a one-line representation of a SpW packet.
|
|
596
|
-
|
|
597
|
-
Args:
|
|
598
|
-
packet (bytes): the raw packet
|
|
599
|
-
|
|
600
|
-
Returns:
|
|
601
|
-
a one-line representation of a SpW packet
|
|
602
|
-
"""
|
|
603
|
-
RMAP_PROTOCOL_ID = 0x01
|
|
604
|
-
CCSDS_PROTOCOL_ID = 0x02
|
|
605
|
-
|
|
606
|
-
if hasattr(packet, 'raw'):
|
|
607
|
-
packet = packet.raw
|
|
608
|
-
|
|
609
|
-
if get_protocol_id(packet) == RMAP_PROTOCOL_ID:
|
|
610
|
-
msg = (
|
|
611
|
-
f"RMAP: "
|
|
612
|
-
f"0x{packet[0]:0x}:"
|
|
613
|
-
f"0x{packet[1]:0x}:"
|
|
614
|
-
f"0x{packet[2]:0x}:"
|
|
615
|
-
f"0x{packet[3]:0x}:"
|
|
616
|
-
f"0x{packet[4]:0x}:"
|
|
617
|
-
f"0x{packet[5:7].hex()}:"
|
|
618
|
-
f"0x{packet[7]:0x}:"
|
|
619
|
-
f"0x{packet[8:12].hex()}:"
|
|
620
|
-
f"0x{packet[12:15].hex()}:"
|
|
621
|
-
f"0x{packet[15]:0x}"
|
|
622
|
-
)
|
|
623
|
-
elif get_protocol_id(packet) == CCSDS_PROTOCOL_ID:
|
|
624
|
-
msg = (
|
|
625
|
-
"CCSDS Packet"
|
|
626
|
-
)
|
|
627
|
-
else:
|
|
628
|
-
msg = "Extended Protocol Identifier is not supported"
|
|
629
|
-
|
|
630
|
-
return msg
|