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/ni/alarms/cdaq9375.py
DELETED
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module defines the basic classes to access the UPS and TVAC info and send alarms to TVAC readout ensured by
|
|
3
|
-
NI CDAQ9375 controller that is used.
|
|
4
|
-
"""
|
|
5
|
-
import logging
|
|
6
|
-
from typing import List
|
|
7
|
-
|
|
8
|
-
from egse.decorators import dynamic_interface
|
|
9
|
-
from egse.device import DeviceConnectionState
|
|
10
|
-
from egse.device import DeviceInterface
|
|
11
|
-
from egse.ni.alarms.cdaq9375_devif import cdaq9375Error, cdaq9375SocketInterface
|
|
12
|
-
from egse.proxy import Proxy
|
|
13
|
-
from egse.settings import Settings
|
|
14
|
-
from egse.zmq_ser import connect_address
|
|
15
|
-
from egse.mixin import dynamic_command
|
|
16
|
-
from egse.mixin import add_lf
|
|
17
|
-
from egse.system import format_datetime
|
|
18
|
-
from datetime import datetime
|
|
19
|
-
from numpy import array, sum
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
LOGGER = logging.getLogger(__name__)
|
|
23
|
-
|
|
24
|
-
CTRL_SETTINGS = Settings.load("NI Control Server")
|
|
25
|
-
CDAQ_SETTINGS = Settings.load("NI Controller")
|
|
26
|
-
DEVICE_SETTINGS = Settings.load(filename="cdaq9375.yaml")
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class cdaq9375Interface(DeviceInterface):
|
|
30
|
-
"""
|
|
31
|
-
Interface definition for the Signals acquisitions and emission of the CDAQ9375 Controller, Simulator and Proxy..
|
|
32
|
-
"""
|
|
33
|
-
@dynamic_interface
|
|
34
|
-
def info(self) -> str:
|
|
35
|
-
"""
|
|
36
|
-
Returns basic information about the device, its name, firmware version etc.
|
|
37
|
-
|
|
38
|
-
The string returned is subject to change without notice and can not be used for parsing
|
|
39
|
-
information.
|
|
40
|
-
|
|
41
|
-
Returns:
|
|
42
|
-
An identification string of the instrument.
|
|
43
|
-
"""
|
|
44
|
-
raise NotImplementedError
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
@dynamic_interface
|
|
48
|
-
def get_tvac_and_ups_state(self):
|
|
49
|
-
"""
|
|
50
|
-
Returns a dictionary with the state (1 or 0) of UPS_Ix and UPS_Arrakis (alarm summary and power supply absence)
|
|
51
|
-
and the state of TVAC. The timestamp (well formatted with the fucntion format_datetime) with the CDAQ9375 time
|
|
52
|
-
is included in the dictionary:
|
|
53
|
-
{"timestamp": 2023-05-17T13:27:45.335,
|
|
54
|
-
"UPS_Arrakis_alarm_summary": 1/0,
|
|
55
|
-
"UPS_Arrakis_power_supply_absence": 1/0,
|
|
56
|
-
"UPS_Ix_alarm_summary": 1/0,
|
|
57
|
-
"UPS_Ix_power_supply_absence": 1/0,
|
|
58
|
-
"TVAC_low_temp": 1/0,
|
|
59
|
-
"TVAC_High_Temp": 1/0,
|
|
60
|
-
"TVAC_Interlock_Cryo": 1/0,
|
|
61
|
-
"TVAC_vacuum": 1/0}
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
raise NotImplementedError
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
@dynamic_interface
|
|
68
|
-
def send_egse_state_to_tvac(self):
|
|
69
|
-
"""
|
|
70
|
-
Send to TVAC the state of EGSE (EXP1, EXP2, EXP3, EXP4)
|
|
71
|
-
EXP1: Low Temp NOP
|
|
72
|
-
EXP2: High Temp NOP
|
|
73
|
-
EXP3: low/High Temp OP
|
|
74
|
-
EXP4: UPS alarm (UPS_Ix_alarm_summary or UPS_Ix_power_supply_absence or UPS_Arrakis_alarm_summary or UPS_Arrakis_power_supply_absence)
|
|
75
|
-
"""
|
|
76
|
-
|
|
77
|
-
raise NotImplementedError
|
|
78
|
-
|
|
79
|
-
@dynamic_interface
|
|
80
|
-
def dec2bitlist_compl(self, d:int):
|
|
81
|
-
"""
|
|
82
|
-
Decompose a integer (base 10) into a list of power of 2.
|
|
83
|
-
e.g. 14 -> [8, 4, 2] (8+4+2 = 14)
|
|
84
|
-
Args:
|
|
85
|
-
d: integer base 10 to decompose (d <= 15)
|
|
86
|
-
returns:
|
|
87
|
-
list of power of 2
|
|
88
|
-
"""
|
|
89
|
-
|
|
90
|
-
raise NotImplementedError
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
class cdaq9375Simulator(cdaq9375Interface):
|
|
95
|
-
"""
|
|
96
|
-
The cdaq9375 Simulator class.
|
|
97
|
-
"""
|
|
98
|
-
|
|
99
|
-
def __init__(self):
|
|
100
|
-
self._is_connected = True
|
|
101
|
-
self.temp_operation = False
|
|
102
|
-
|
|
103
|
-
def is_connected(self):
|
|
104
|
-
return self._is_connected
|
|
105
|
-
|
|
106
|
-
def is_simulator(self):
|
|
107
|
-
return True
|
|
108
|
-
|
|
109
|
-
def connect(self):
|
|
110
|
-
self._is_connected = True
|
|
111
|
-
|
|
112
|
-
def disconnect(self):
|
|
113
|
-
self._is_connected = False
|
|
114
|
-
|
|
115
|
-
def reconnect(self):
|
|
116
|
-
self.connect()
|
|
117
|
-
|
|
118
|
-
def get_id(self):
|
|
119
|
-
pass
|
|
120
|
-
|
|
121
|
-
def info(self):
|
|
122
|
-
pass
|
|
123
|
-
|
|
124
|
-
def get_tvac_and_ups_state(self):
|
|
125
|
-
pass
|
|
126
|
-
|
|
127
|
-
def send_egse_state_to_tvac(self):
|
|
128
|
-
pass
|
|
129
|
-
|
|
130
|
-
def dec2bitlist_compl(self, d:int):
|
|
131
|
-
pass
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
class cdaq9375Controller(cdaq9375Interface):
|
|
135
|
-
"""The cdaq9375Controller allows controlling the NI CDAQ 9375 alarms device."""
|
|
136
|
-
|
|
137
|
-
def __init__(self):
|
|
138
|
-
"""Initialize the cdaq9375 Controller interface."""
|
|
139
|
-
|
|
140
|
-
super().__init__()
|
|
141
|
-
|
|
142
|
-
LOGGER.debug("Initializing NI CDAQ 9375")
|
|
143
|
-
|
|
144
|
-
try:
|
|
145
|
-
self.cdaq = cdaq9375SocketInterface()
|
|
146
|
-
self.cdaq.connect(CDAQ_SETTINGS.HOSTNAME) # IP address of the computer with Labview
|
|
147
|
-
|
|
148
|
-
except cdaq9375Error as exc:
|
|
149
|
-
LOGGER.warning(f"TempError caught: Couldn't establish connection ({exc})")
|
|
150
|
-
raise cdaq9375Error(
|
|
151
|
-
"Couldn't establish a connection with the NI CDAQ 9375 controller."
|
|
152
|
-
) from exc
|
|
153
|
-
|
|
154
|
-
def connect(self):
|
|
155
|
-
"""Connects to the CDAQ9375 alarms device.
|
|
156
|
-
|
|
157
|
-
Raises:
|
|
158
|
-
DeviceNotFoundError: when the CDAQ9375 alarms device is not connected.
|
|
159
|
-
"""
|
|
160
|
-
try:
|
|
161
|
-
self.cdaq.connect(CDAQ_SETTINGS.HOSTNAME)
|
|
162
|
-
except cdaq9Error as exc:
|
|
163
|
-
LOGGER.warning(f"cdaqError caught: Couldn't establish connection ({exc})")
|
|
164
|
-
raise ConnectionError("Couldn't establish a connection with the NI DAQ9375 controller.") from exc
|
|
165
|
-
|
|
166
|
-
self.notify_observers(DeviceConnectionState.DEVICE_CONNECTED)
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
def disconnect(self):
|
|
170
|
-
try:
|
|
171
|
-
self.cdaq.disconnect()
|
|
172
|
-
except cdaq9375Error as exc:
|
|
173
|
-
raise ConnectionError("Couldn't establish a connection with the NI CDAQ 9375 controller.") from exc
|
|
174
|
-
|
|
175
|
-
self.notify_observers(DeviceConnectionState.DEVICE_NOT_CONNECTED)
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
def reconnect(self):
|
|
179
|
-
if self.is_connected():
|
|
180
|
-
self.disconnect()
|
|
181
|
-
self.connect()
|
|
182
|
-
|
|
183
|
-
def is_connected(self):
|
|
184
|
-
"""Check if the CDAQ9375 Controller is connected."""
|
|
185
|
-
return self.cdaq.is_connected()
|
|
186
|
-
|
|
187
|
-
def is_simulator(self):
|
|
188
|
-
return False
|
|
189
|
-
|
|
190
|
-
def get_id(self):
|
|
191
|
-
return self.cdaq.get_id()
|
|
192
|
-
|
|
193
|
-
def info(self):
|
|
194
|
-
pass
|
|
195
|
-
|
|
196
|
-
def get_tvac_and_ups_state(self) -> dict:
|
|
197
|
-
"""
|
|
198
|
-
Returns a dictionary with the state (1 or 0) of UPS_Ix and UPS_Arrakis (alarm summary and power supply absence)
|
|
199
|
-
and the state of TVAC. The timestamp (well formatted with the fucntion format_datetime) with the CDAQ9375 time
|
|
200
|
-
is included in the dictionary:
|
|
201
|
-
{"timestamp": 2023-05-17T13:27:45.335,
|
|
202
|
-
"UPS_Arrakis_alarm_summary": 1/0,
|
|
203
|
-
"UPS_Arrakis_power_supply_absence": 1/0,
|
|
204
|
-
"UPS_Ix_alarm_summary": 1/0,
|
|
205
|
-
"UPS_Ix_power_supply_absence": 1/0,
|
|
206
|
-
"TVAC_low_temp": 1/0,
|
|
207
|
-
"TVAC_High_Temp": 1/0,
|
|
208
|
-
"TVAC_Interlock_Cryo": 1/0,
|
|
209
|
-
"TVAC_vacuum": 1/0}
|
|
210
|
-
"""
|
|
211
|
-
|
|
212
|
-
response = self.cdaq.trans("\x00\x00\x00\x16READ_P1P2_NIDAQ_9181")
|
|
213
|
-
# the 2 last elements of response are the alarm values, first is P2 (UPS) and second is P1 (TVAC): P2P1
|
|
214
|
-
# Contacts both for P1 and P2 are normally closed, so we must take the complement
|
|
215
|
-
|
|
216
|
-
response = response.strip()
|
|
217
|
-
data_time = response.split("R")[0]
|
|
218
|
-
timestamp = format_datetime(datetime.strptime(data_time, "%y/%m/%d%H:%M:%S.%f"))
|
|
219
|
-
|
|
220
|
-
total_alarm = {"timestamp": timestamp}
|
|
221
|
-
|
|
222
|
-
p2_code = int(response[-2], 16)
|
|
223
|
-
p2_bitlist = self.dec2bitlist_compl(p2_code)
|
|
224
|
-
p2_bit_to_alarm_name = {1: "UPS_Arrakis_alarm_summary", 2: "UPS_Arrakis_power_supply_absence", 4: "UPS_Ix_alarm_summary", 8: "UPS_Ix_power_supply_absence"}
|
|
225
|
-
p2_alarm = {"UPS_Arrakis_alarm_summary": 0, "UPS_Arrakis_power_supply_absence": 0, "UPS_Ix_alarm_summary": 0, "UPS_Ix_power_supply_absence": 0}
|
|
226
|
-
if p2_bitlist != []:
|
|
227
|
-
for bit in p2_bitlist:
|
|
228
|
-
p2_alarm[p2_bit_to_alarm_name[bit]] = 1
|
|
229
|
-
|
|
230
|
-
p1_code = int(response[-1], 16)
|
|
231
|
-
p1_bitlist = self.dec2bitlist_compl(p1_code)
|
|
232
|
-
p1_bit_to_alarm_name = {1: "TVAC_low_temp", 2: "TVAC_High_Temp", 4: "TVAC_Interlock_Cryo", 8: "TVAC_vacuum"}
|
|
233
|
-
p1_alarm = {"TVAC_low_temp": 0, "TVAC_High_Temp": 0, "TVAC_Interlock_Cryo": 0, "TVAC_vacuum": 0}
|
|
234
|
-
if p1_bitlist != []:
|
|
235
|
-
for bit in p1_bitlist:
|
|
236
|
-
p1_alarm[p1_bit_to_alarm_name[bit]] = 1
|
|
237
|
-
|
|
238
|
-
total_alarm.update(p2_alarm)
|
|
239
|
-
total_alarm.update(p1_alarm)
|
|
240
|
-
|
|
241
|
-
return total_alarm
|
|
242
|
-
|
|
243
|
-
def send_egse_state_to_tvac(self, alarm_exp1: bool, alarm_exp2: bool, alarm_exp3: bool, alarm_exp4: bool) -> str:
|
|
244
|
-
"""
|
|
245
|
-
Send to TVAC the state of EGSE (EXP1, EXP2, EXP3, EXP4)
|
|
246
|
-
EXP1: Low Temp NOP
|
|
247
|
-
EXP2: High Temp NOP
|
|
248
|
-
EXP3: low/High Temp OP
|
|
249
|
-
EXP4: UPS alarm (UPS_Ix_alarm_summary or UPS_Ix_power_supply_absence or UPS_Arrakis_alarm_summary or UPS_Arrakis_power_supply_absence)
|
|
250
|
-
"""
|
|
251
|
-
alarm_list = [int(not(alarm_exp1)), int(not(alarm_exp2)), int(not(alarm_exp3)), int(not(alarm_exp4))]
|
|
252
|
-
bit_array = array([alarm_list[i] * 2 ** i for i in range(4)])
|
|
253
|
-
bit_array = bit_array[bit_array != 0]
|
|
254
|
-
if len(bit_array) == 0:
|
|
255
|
-
return self.cdaq.trans("\x00\x00\x00\x16WRITE_P3X_NIDAQ_918100")
|
|
256
|
-
else:
|
|
257
|
-
value_alarm = hex(sum(bit_array))[-1].upper()
|
|
258
|
-
return self.cdaq.trans(f"\x00\x00\x00\x16WRITE_P3X_NIDAQ_91810{value_alarm}")
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
def dec2bitlist_compl(self, d:int) -> list:
|
|
262
|
-
"""
|
|
263
|
-
Decompose a integer (base 10) into a list of power of 2.
|
|
264
|
-
e.g. 14 -> [8, 4, 2] (8+4+2 = 14)
|
|
265
|
-
Args:
|
|
266
|
-
d: integer base 10 to decompose (d <= 15)
|
|
267
|
-
returns:
|
|
268
|
-
list of power of 2
|
|
269
|
-
"""
|
|
270
|
-
bits = []
|
|
271
|
-
bits_compl = []
|
|
272
|
-
for i in [8, 4, 2, 1]:
|
|
273
|
-
if i <= d:
|
|
274
|
-
bits.append(i)
|
|
275
|
-
d %= i
|
|
276
|
-
for i in [8, 4, 2, 1]:
|
|
277
|
-
if i not in bits:
|
|
278
|
-
bits_compl.append(i)
|
|
279
|
-
return bits_compl
|
|
280
|
-
|
|
281
|
-
class cdaq9375Proxy(Proxy, cdaq9375Interface):
|
|
282
|
-
"""The cdaq9375Proxy class is used to connect to the control server and send commands to
|
|
283
|
-
the NI CDAQ 9375 device remotely."""
|
|
284
|
-
def __init__(
|
|
285
|
-
self,
|
|
286
|
-
protocol=CTRL_SETTINGS.PROTOCOL,
|
|
287
|
-
hostname=CTRL_SETTINGS.HOSTNAME,
|
|
288
|
-
port=CTRL_SETTINGS.CDAQ9375.get("COMMANDING_PORT"),
|
|
289
|
-
timeout = CTRL_SETTINGS.CDAQ9375.get("TIMEOUT") * 1000
|
|
290
|
-
):
|
|
291
|
-
"""
|
|
292
|
-
Args:
|
|
293
|
-
protocol: the transport protocol [default is taken from settings file]
|
|
294
|
-
hostname: location of the control server (IP address)
|
|
295
|
-
[default is taken from settings file]
|
|
296
|
-
port: TCP port on which the control server is listening for commands
|
|
297
|
-
[default is taken from settings file]
|
|
298
|
-
"""
|
|
299
|
-
super().__init__(connect_address(protocol, hostname, port), timeout=timeout)
|
|
300
|
-
|
egse/ni/alarms/cdaq9375.yaml
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
BaseClass:
|
|
2
|
-
egse.ni.alarms.cdaq9375.cdaq9375Interface
|
|
3
|
-
|
|
4
|
-
ProxyClass:
|
|
5
|
-
egse.ni.alarms.cdaq9375.cdaq9375Proxy
|
|
6
|
-
|
|
7
|
-
ControlServerClass:
|
|
8
|
-
egse.ni.alarms.cdaq9375.cdaq9375ControlServer
|
|
9
|
-
|
|
10
|
-
ControlServer:
|
|
11
|
-
egse.ni.alarms.cdaq9375_cs
|
|
12
|
-
|
|
13
|
-
Commands:
|
|
14
|
-
|
|
15
|
-
# Each of these groups is parsed and used on both the server and the client side.
|
|
16
|
-
# The group name (e.g. is_simulator) will be monkey patched in the Proxy class for the device or service.
|
|
17
|
-
# The other field are:
|
|
18
|
-
# description: Used by the doc_string method to generate a help string
|
|
19
|
-
# cmd: Command string that will eventually be send to the hardware controller for the
|
|
20
|
-
# device after the arguments have been filled.
|
|
21
|
-
# device_method: The name of the method to be called on the device class.
|
|
22
|
-
# These should all be defined by the base class for the device.
|
|
23
|
-
# This method should exist in the subclass of the CommandProtocol base class.
|
|
24
|
-
|
|
25
|
-
# Definition of the the DeviceInterface
|
|
26
|
-
|
|
27
|
-
disconnect:
|
|
28
|
-
description: Disconnect from the NI device controller. This command will be send to the
|
|
29
|
-
NI Control Server which will then disconnect from the hardware controller.
|
|
30
|
-
This command doesn't affect the ZeroMQ connection of this Proxy to the
|
|
31
|
-
control server. Use the service command ``disconnect_cs()`` to disconnect
|
|
32
|
-
from the control server.
|
|
33
|
-
|
|
34
|
-
connect:
|
|
35
|
-
description: Connect the temperature hardware controller
|
|
36
|
-
|
|
37
|
-
reconnect:
|
|
38
|
-
description: Reconnect the temperature hardware controller.
|
|
39
|
-
|
|
40
|
-
This command will force a disconnect and then try to re-connect to the controller.
|
|
41
|
-
|
|
42
|
-
is_simulator:
|
|
43
|
-
description: Ask if the control server is a simulator instead of the real cdaq9375Controller class.
|
|
44
|
-
returns: bool | True if the far end is a simulator instead of the real hardware
|
|
45
|
-
|
|
46
|
-
is_connected:
|
|
47
|
-
description: Check if the SRS Hardware Controller is connected.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
# Definition of the device commands
|
|
51
|
-
info:
|
|
52
|
-
description: Returns basic information about the device, its name, firmwre version etc.
|
|
53
|
-
returns: str
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
get_tvac_and_ups_state:
|
|
57
|
-
description: Returns a dictionary with the state (1 or 0) of UPS_Ix and UPS_Arrakis (alarm summary and power
|
|
58
|
-
supply absence) and the state of TVAC. The timestamp (well formatted with the fucntion
|
|
59
|
-
format_datetime) with the CDAQ9375 time is included in the dictionary
|
|
60
|
-
{"timestamp" = 2023-05-17T13:27:45.335,
|
|
61
|
-
"UPS_Arrakis_alarm_summary" = 1/0,
|
|
62
|
-
"UPS_Arrakis_power_supply_absence" = 1/0,
|
|
63
|
-
"UPS_Ix_alarm_summary" = 1/0,
|
|
64
|
-
"UPS_Ix_power_supply_absence" = 1/0,
|
|
65
|
-
"TVAC_low_temp" = 1/0,
|
|
66
|
-
"TVAC_High_Temp" = 1/0,
|
|
67
|
-
"TVAC_Interlock_Cryo" = 1/0,
|
|
68
|
-
"TVAC_vacuum" = 1/0}
|
|
69
|
-
returns: dict
|
|
70
|
-
|
|
71
|
-
send_egse_state_to_tvac:
|
|
72
|
-
description: Send to TVAC the state of EGSE (EXP1, EXP2, EXP3, EXP4)
|
|
73
|
-
EXP1 = Low Temp NOP
|
|
74
|
-
EXP2 = High Temp NOP
|
|
75
|
-
EXP3 = low/High Temp OP
|
|
76
|
-
EXP4 = UPS alarm (UPS_Ix_alarm_summary or UPS_Ix_power_supply_absence or UPS_Arrakis_alarm_summary or UPS_Arrakis_power_supply_absence)
|
|
77
|
-
cmd: '{alarm_exp1} {alarm_exp2} {alarm_exp3} {alarm_exp4}'
|
|
78
|
-
returns: str
|
|
79
|
-
|
|
80
|
-
dec2bitlist_compl:
|
|
81
|
-
description: Decompose a integer (base 10) into a list of power of 2.
|
|
82
|
-
e.g. 14 -> [8, 4, 2] (8+4+2 = 14)
|
|
83
|
-
Args
|
|
84
|
-
d is an integer base 10 to decompose (d <= 15)
|
|
85
|
-
returns
|
|
86
|
-
list of power of 2
|
|
87
|
-
cmd: '{d}'
|
|
88
|
-
returns: list
|
|
89
|
-
|
egse/ni/alarms/cdaq9375_cs.py
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import argparse
|
|
2
|
-
import click
|
|
3
|
-
import logging
|
|
4
|
-
import sys
|
|
5
|
-
|
|
6
|
-
import zmq
|
|
7
|
-
|
|
8
|
-
from egse.control import ControlServer
|
|
9
|
-
from egse.control import is_control_server_active
|
|
10
|
-
|
|
11
|
-
from egse.ni.alarms.cdaq9375 import cdaq9375Proxy
|
|
12
|
-
from egse.ni.alarms.cdaq9375_protocol import cdaq9375Protocol
|
|
13
|
-
from egse.settings import Settings
|
|
14
|
-
from egse.zmq_ser import connect_address
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
logger = logging.getLogger(__name__)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
CTRL_SETTINGS = Settings.load("NI Control Server")
|
|
21
|
-
|
|
22
|
-
def is_cdaq9375_cs_active(timeout: float = 0.5):
|
|
23
|
-
"""Check if the CDAQ9375 Control Server is running.
|
|
24
|
-
|
|
25
|
-
Args:
|
|
26
|
-
timeout (float): timeout when waiting for a reply [seconds, default=0.5]
|
|
27
|
-
Returns:
|
|
28
|
-
True if the control server is running and replied with the expected answer.
|
|
29
|
-
"""
|
|
30
|
-
|
|
31
|
-
endpoint = connect_address(
|
|
32
|
-
CTRL_SETTINGS.PROTOCOL, CTRL_SETTINGS.HOSTNAME, CTRL_SETTINGS.CDAQ9375.get("COMMANDING_PORT")
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
return is_control_server_active(endpoint, timeout)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class cdaq9375ControlServer(ControlServer):
|
|
39
|
-
"""
|
|
40
|
-
cdaq9375ControlServer - Command and monitor the NI CDAQ 9375 Controllers.
|
|
41
|
-
This class works as a command and monitoring server to control the Controller remotely.
|
|
42
|
-
The sever binds to the following ZeroMQ sockets:
|
|
43
|
-
* a REQ-REP socket that can be used as a command server. Any client can connect and
|
|
44
|
-
send a command to the Temp controller.
|
|
45
|
-
* a PUB-SUP socket that serves as a monitoring server. It will send out Temp status
|
|
46
|
-
information to all the connected clients every DELAY seconds.
|
|
47
|
-
"""
|
|
48
|
-
|
|
49
|
-
def __init__(self):
|
|
50
|
-
super().__init__()
|
|
51
|
-
|
|
52
|
-
self.device_protocol = cdaq9375Protocol(self)
|
|
53
|
-
|
|
54
|
-
self.logger.debug(f"Binding ZeroMQ socket to {self.device_protocol.get_bind_address()}")
|
|
55
|
-
|
|
56
|
-
self.device_protocol.bind(self.dev_ctrl_cmd_sock)
|
|
57
|
-
|
|
58
|
-
self.poller.register(self.dev_ctrl_cmd_sock, zmq.POLLIN)
|
|
59
|
-
|
|
60
|
-
def get_communication_protocol(self):
|
|
61
|
-
return CTRL_SETTINGS.PROTOCOL
|
|
62
|
-
|
|
63
|
-
def get_commanding_port(self):
|
|
64
|
-
return CTRL_SETTINGS.CDAQ9375.get("COMMANDING_PORT")
|
|
65
|
-
|
|
66
|
-
def get_service_port(self):
|
|
67
|
-
return CTRL_SETTINGS.CDAQ9375.get("SERVICE_PORT")
|
|
68
|
-
|
|
69
|
-
def get_monitoring_port(self):
|
|
70
|
-
return CTRL_SETTINGS.CDAQ9375.get("MONITORING_PORT")
|
|
71
|
-
|
|
72
|
-
def get_storage_mnemonic(self):
|
|
73
|
-
try:
|
|
74
|
-
return CTRL_SETTINGS.CDAQ9375.get("STORAGE_MNEMONIC")
|
|
75
|
-
except AttributeError:
|
|
76
|
-
return "DAS-CDAQ-ALARMS-EMPTY"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
@click.group()
|
|
80
|
-
def cli():
|
|
81
|
-
pass
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
@cli.command()
|
|
85
|
-
@click.option("--simulator", "--sim", is_flag=True, help="Start the NI CDAQ9375 Simulator as the backend.")
|
|
86
|
-
def start(simulator):
|
|
87
|
-
"""Start the NI CDAQ9375 Control Server."""
|
|
88
|
-
|
|
89
|
-
if simulator:
|
|
90
|
-
|
|
91
|
-
Settings.set_simulation_mode(True)
|
|
92
|
-
|
|
93
|
-
try:
|
|
94
|
-
|
|
95
|
-
controller = cdaq9375ControlServer()
|
|
96
|
-
controller.serve()
|
|
97
|
-
|
|
98
|
-
except KeyboardInterrupt:
|
|
99
|
-
|
|
100
|
-
print("Shutdown requested...exiting")
|
|
101
|
-
|
|
102
|
-
except SystemExit as exit_code:
|
|
103
|
-
|
|
104
|
-
print("System Exit with code {}.".format(exit_code))
|
|
105
|
-
sys.exit(exit_code)
|
|
106
|
-
|
|
107
|
-
except Exception:
|
|
108
|
-
|
|
109
|
-
logger.exception("Cannot start the NI CDAQ9375Control Server")
|
|
110
|
-
|
|
111
|
-
# The above line does exactly the same as the traceback, but on the logger
|
|
112
|
-
# import traceback
|
|
113
|
-
# traceback.print_exc(file=sys.stdout)
|
|
114
|
-
|
|
115
|
-
return 0
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
@cli.command()
|
|
119
|
-
def stop():
|
|
120
|
-
"""Send a 'quit_server' command to the NI CDAQ9375 Control Server."""
|
|
121
|
-
|
|
122
|
-
with cdaq9375Proxy() as proxy:
|
|
123
|
-
|
|
124
|
-
sp = proxy.get_service_proxy()
|
|
125
|
-
sp.quit_server()
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if __name__ == "__main__":
|
|
129
|
-
|
|
130
|
-
sys.exit(cli())
|
egse/ni/alarms/cdaq9375_devif.py
DELETED
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
The device interface for the NICDAQ 9375 Controller which is used at IAS for alarms system.
|
|
3
|
-
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
import logging
|
|
7
|
-
import time
|
|
8
|
-
import socket
|
|
9
|
-
import struct
|
|
10
|
-
from typing import List
|
|
11
|
-
|
|
12
|
-
from egse.settings import Settings
|
|
13
|
-
from egse.exceptions import DeviceNotFoundError
|
|
14
|
-
from egse.device import DeviceConnectionError, DeviceError
|
|
15
|
-
from egse.device import DeviceConnectionInterface, DeviceTransport, DeviceTimeoutError
|
|
16
|
-
from egse.command import ClientServerCommand
|
|
17
|
-
|
|
18
|
-
logger = logging.getLogger(__name__)
|
|
19
|
-
|
|
20
|
-
ctrl_settings = Settings.load("NI Controller")
|
|
21
|
-
|
|
22
|
-
DEVICE_NAME = "CDAQ9375"
|
|
23
|
-
|
|
24
|
-
READ_TIMEOUT = 1
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
class cdaq9375Error(Exception):
|
|
28
|
-
"""Base exception for all ptc10 errors."""
|
|
29
|
-
pass
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class cdaq9375Command(ClientServerCommand):
|
|
33
|
-
def get_cmd_string(self, *args, **kwargs) -> str:
|
|
34
|
-
out = super().get_cmd_string(*args, **kwargs)
|
|
35
|
-
return out + "\n"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class cdaq9375SocketInterface(DeviceConnectionInterface, DeviceTransport):
|
|
39
|
-
"""Defines the low-level interface to the NI CDAQ9375 Controller.
|
|
40
|
-
Connects to the Labview interface via TCP/IP socket"""
|
|
41
|
-
|
|
42
|
-
def __init__(self, hostname=None, port=None):
|
|
43
|
-
self.hostname = ctrl_settings.HOSTNAME if hostname is None else hostname
|
|
44
|
-
self.port = ctrl_settings.CDAQ9375_PORT if port is None else port
|
|
45
|
-
self.sock = None
|
|
46
|
-
|
|
47
|
-
self.is_connection_open = False
|
|
48
|
-
|
|
49
|
-
def connect(self, hostname: str):
|
|
50
|
-
# Sanity checks
|
|
51
|
-
if self.is_connection_open:
|
|
52
|
-
logger.warning(f"{DEVICE_NAME}: trying to connect to an already connected socket.")
|
|
53
|
-
return
|
|
54
|
-
if self.hostname in (None, ""):
|
|
55
|
-
raise ValueError(f"{DEVICE_NAME}: hostname is not initialized.")
|
|
56
|
-
|
|
57
|
-
if self.port in (None, 0):
|
|
58
|
-
raise ValueError(f"{DEVICE_NAME}: port number is not initialized.")
|
|
59
|
-
|
|
60
|
-
try:
|
|
61
|
-
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
62
|
-
_id = self.get_id()
|
|
63
|
-
logger.warning(f"Connected to: {_id}")
|
|
64
|
-
|
|
65
|
-
except socket.error as e_socket:
|
|
66
|
-
raise DeviceConnectionError(DEVICE_NAME, "Failed to create socket.") from e_socket
|
|
67
|
-
# Asking for instrument description
|
|
68
|
-
|
|
69
|
-
# We set a timeout of 3 sec before connecting and reset to None
|
|
70
|
-
# (=blocking) after the connect. The reason for this is because when no
|
|
71
|
-
# device is available, e.g during testing, the timeout will take about
|
|
72
|
-
# two minutes which is way too long. It needs to be evaluated if this
|
|
73
|
-
# approach is acceptable and not causing problems during production.
|
|
74
|
-
|
|
75
|
-
try:
|
|
76
|
-
logger.debug(f'Connecting a socket to host "{self.hostname}" using port {self.port}')
|
|
77
|
-
self.sock.settimeout(3)
|
|
78
|
-
self.sock.connect((self.hostname, self.port))
|
|
79
|
-
self.sock.settimeout(None)
|
|
80
|
-
except ConnectionRefusedError as exc:
|
|
81
|
-
raise DeviceConnectionError(
|
|
82
|
-
DEVICE_NAME, f"Connection refused to {self.hostname}:{self.port}."
|
|
83
|
-
) from exc
|
|
84
|
-
except TimeoutError as exc:
|
|
85
|
-
raise DeviceTimeoutError(
|
|
86
|
-
DEVICE_NAME, f"Connection to {self.hostname}:{self.port} timed out."
|
|
87
|
-
) from exc
|
|
88
|
-
except socket.gaierror as exc:
|
|
89
|
-
raise DeviceConnectionError(
|
|
90
|
-
DEVICE_NAME, f"socket address info error for {self.hostname}"
|
|
91
|
-
) from exc
|
|
92
|
-
except socket.herror as exc:
|
|
93
|
-
raise DeviceConnectionError(
|
|
94
|
-
DEVICE_NAME, f"socket host address error for {self.hostname}"
|
|
95
|
-
) from exc
|
|
96
|
-
except socket.timeout as exc:
|
|
97
|
-
raise DeviceTimeoutError(
|
|
98
|
-
DEVICE_NAME, f"socket timeout error for {self.hostname}:{self.port}"
|
|
99
|
-
) from exc
|
|
100
|
-
except OSError as exc:
|
|
101
|
-
raise DeviceConnectionError(DEVICE_NAME, f"OSError caught ({exc}).") from exc
|
|
102
|
-
|
|
103
|
-
self.is_connection_open = True
|
|
104
|
-
|
|
105
|
-
if not self.is_connected():
|
|
106
|
-
raise DeviceConnectionError(
|
|
107
|
-
DEVICE_NAME, "Device is not connected, check logging messages for the cause."
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
def disconnect(self):
|
|
111
|
-
"""
|
|
112
|
-
Disconnects from the device
|
|
113
|
-
Raises:
|
|
114
|
-
DeviceConnectionError when the connection has not been closed correctly
|
|
115
|
-
|
|
116
|
-
"""
|
|
117
|
-
try:
|
|
118
|
-
if self.is_connection_open:
|
|
119
|
-
logger.debug(f"Disconnecting from {self.hostname}")
|
|
120
|
-
self.sock.close()
|
|
121
|
-
self.is_connection_open = False
|
|
122
|
-
except Exception as e_exc:
|
|
123
|
-
raise DeviceConnectionError(
|
|
124
|
-
DEVICE_NAME, f"Could not close socket to {self.hostname}") from e_exc
|
|
125
|
-
|
|
126
|
-
def is_connected(self):
|
|
127
|
-
"""Return True if the device is connected."""
|
|
128
|
-
if not self.is_connection_open:
|
|
129
|
-
return False
|
|
130
|
-
return True
|
|
131
|
-
|
|
132
|
-
def get_response(self, cmd_string):
|
|
133
|
-
pass
|
|
134
|
-
|
|
135
|
-
def get_id(self):
|
|
136
|
-
return DEVICE_NAME
|
|
137
|
-
|
|
138
|
-
def write(self, command: str):
|
|
139
|
-
try:
|
|
140
|
-
#logger.info(f"{command=}")
|
|
141
|
-
self.sock.sendall(command.encode())
|
|
142
|
-
|
|
143
|
-
except socket.timeout as e_timeout:
|
|
144
|
-
raise DeviceTimeoutError(DEVICE_NAME, "Socket timeout error") from e_timeout
|
|
145
|
-
except socket.error as e_socket:
|
|
146
|
-
# Interpret any socket-related error as a connection error
|
|
147
|
-
raise DeviceConnectionError(DEVICE_NAME, "Socket communication error.") from e_socket
|
|
148
|
-
except AttributeError:
|
|
149
|
-
if not self.is_connection_open:
|
|
150
|
-
msg = "The CDAQ9375 is not connected, use the connect() method."
|
|
151
|
-
raise DeviceConnectionError(DEVICE_NAME, msg)
|
|
152
|
-
raise
|
|
153
|
-
|
|
154
|
-
def read(self) -> List:
|
|
155
|
-
# Set a timeout of READ_TIMEOUT to the socket.recv
|
|
156
|
-
saved_timeout = self.sock.gettimeout()
|
|
157
|
-
self.sock.settimeout(READ_TIMEOUT)
|
|
158
|
-
try:
|
|
159
|
-
# Extracts the msg size from 4 bytes sent by Labview - mind the encoding. The number
|
|
160
|
-
# reprensets the number of bytes of data
|
|
161
|
-
size = struct.unpack('i', self.sock.recv(4))[0]
|
|
162
|
-
data = self.sock.recv(size)
|
|
163
|
-
except socket.timeout as e_timeout:
|
|
164
|
-
logger.warning(f"Socket timeout error from {e_timeout}")
|
|
165
|
-
return b"\r\n"
|
|
166
|
-
except TimeoutError as exc:
|
|
167
|
-
logger.warning(f"Socket timeout error: {exc}")
|
|
168
|
-
return b"\r\n"
|
|
169
|
-
finally:
|
|
170
|
-
self.sock.settimeout(saved_timeout)
|
|
171
|
-
|
|
172
|
-
#logger.info(f"Total number of bytes received from the cdaq 9375 is {size}")
|
|
173
|
-
|
|
174
|
-
data = data.decode("ascii")
|
|
175
|
-
|
|
176
|
-
return data
|
|
177
|
-
|
|
178
|
-
def trans(self, cmd: str) -> List:
|
|
179
|
-
self.write(cmd)
|
|
180
|
-
time.sleep(25)
|
|
181
|
-
response = self.read()
|
|
182
|
-
return response
|
|
183
|
-
|