cgse 2024.7.0__py3-none-any.whl → 2025.0.1__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.1.dist-info/METADATA +38 -0
- cgse-2025.0.1.dist-info/RECORD +5 -0
- {cgse-2024.7.0.dist-info → cgse-2025.0.1.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/shutter/__init__.py
DELETED
|
File without changes
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module defines the basic classes to access the Thorlabs Shutter KSC01 controller.
|
|
3
|
-
|
|
4
|
-
The main entry point for the user of this package is through the `ThorlabsPM100Proxy` class:
|
|
5
|
-
|
|
6
|
-
```python
|
|
7
|
-
>>> from egse.shutter.thorlabs.ksc101 import ShutterKSC101Proxy
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
This class will connect to the control server of the Thorlabs KSC101 Shutter Controller and provides all commands to
|
|
11
|
-
control and monitor the shutter status. The control server is a small server application
|
|
12
|
-
that is started as shown below. The control server directly connects to the Shutter Controller through an USB
|
|
13
|
-
interface. When you have now hardware available, the control server can be started in simulator mode by appending the
|
|
14
|
-
`--sim` string to the command below.
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
$ python -m egse.shutter.thorlabs.ksc101_cs
|
|
18
|
-
```
|
|
19
|
-
"""
|
egse/shutter/thorlabs/ksc101.py
DELETED
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
|
|
3
|
-
from egse.decorators import dynamic_interface
|
|
4
|
-
from egse.device import DeviceInterface
|
|
5
|
-
from egse.proxy import Proxy
|
|
6
|
-
from egse.settings import Settings
|
|
7
|
-
from egse.shutter.thorlabs.ksc101_devif import ShutterKSC101Error
|
|
8
|
-
from egse.shutter.thorlabs.ksc101_devif import ShutterKSC101USBInterface
|
|
9
|
-
from egse.zmq_ser import connect_address
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
logger = logging.getLogger(__name__)
|
|
13
|
-
|
|
14
|
-
CTRL_SETTINGS = Settings.load("Shutter KSC101 Control Server")
|
|
15
|
-
DEVICE_SETTINGS = Settings.load(filename="ksc101.yaml")
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class ShutterKSC101Interface(DeviceInterface):
|
|
19
|
-
"""
|
|
20
|
-
The Shutter KSC101 base class.
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
@dynamic_interface
|
|
24
|
-
def set_mode(self):
|
|
25
|
-
"""
|
|
26
|
-
Sets the Shutter KSC101 Controller control mode
|
|
27
|
-
"""
|
|
28
|
-
return NotImplemented
|
|
29
|
-
|
|
30
|
-
@dynamic_interface
|
|
31
|
-
def set_enable(self):
|
|
32
|
-
"""
|
|
33
|
-
Sets the Shutter KSC101 Controller control mode
|
|
34
|
-
"""
|
|
35
|
-
return NotImplemented
|
|
36
|
-
|
|
37
|
-
@dynamic_interface
|
|
38
|
-
def set_cycle(self):
|
|
39
|
-
"""
|
|
40
|
-
Sets the Shutter KSC101 Controller cycling parameters
|
|
41
|
-
"""
|
|
42
|
-
return NotImplemented
|
|
43
|
-
|
|
44
|
-
@dynamic_interface
|
|
45
|
-
def get_mode(self):
|
|
46
|
-
"""
|
|
47
|
-
Sets the Shutter KSC101 Controller control mode
|
|
48
|
-
"""
|
|
49
|
-
return NotImplemented
|
|
50
|
-
|
|
51
|
-
@dynamic_interface
|
|
52
|
-
def get_enable(self):
|
|
53
|
-
"""
|
|
54
|
-
Sets the Shutter KSC101 Controller solenoid status
|
|
55
|
-
"""
|
|
56
|
-
return NotImplemented
|
|
57
|
-
|
|
58
|
-
@dynamic_interface
|
|
59
|
-
def get_cycle(self):
|
|
60
|
-
"""
|
|
61
|
-
Sets the Shutter KSC101 Controller cycle parameters
|
|
62
|
-
"""
|
|
63
|
-
return NotImplemented
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
class ShutterKSC101Simulator(ShutterKSC101Interface):
|
|
67
|
-
"""
|
|
68
|
-
The Thorlabs KSC101 Simulator class.
|
|
69
|
-
"""
|
|
70
|
-
|
|
71
|
-
def __init__(self):
|
|
72
|
-
self._is_connected = True
|
|
73
|
-
self._mode = "single"
|
|
74
|
-
self._cycle = {"Ontime": 1000, "Offtime": 1000, "Number of cycles": 10}
|
|
75
|
-
self._status = False
|
|
76
|
-
|
|
77
|
-
def is_connected(self):
|
|
78
|
-
return self._is_connected
|
|
79
|
-
|
|
80
|
-
def is_simulator(self):
|
|
81
|
-
return True
|
|
82
|
-
|
|
83
|
-
def connect(self):
|
|
84
|
-
self._is_connected = True
|
|
85
|
-
|
|
86
|
-
def disconnect(self):
|
|
87
|
-
self._is_connected = False
|
|
88
|
-
|
|
89
|
-
def reconnect(self):
|
|
90
|
-
if self.is_connected():
|
|
91
|
-
self.disconnect()
|
|
92
|
-
self.connect()
|
|
93
|
-
|
|
94
|
-
def set_mode(self, mode):
|
|
95
|
-
self._mode = mode
|
|
96
|
-
|
|
97
|
-
def set_enable(self, status):
|
|
98
|
-
self._status = status
|
|
99
|
-
|
|
100
|
-
def set_cycle(self, on, off, number):
|
|
101
|
-
self._cycle["Ontime"] = on
|
|
102
|
-
self._cycle["Offtime"] = off
|
|
103
|
-
self._cycle["Number of cycles"] = number
|
|
104
|
-
|
|
105
|
-
def get_mode(self) -> int:
|
|
106
|
-
mode = {"manual": 0x01, "single": 0x02, "auto": 0x03, "trigger": 0x04}
|
|
107
|
-
return mode[self._mode]
|
|
108
|
-
|
|
109
|
-
def get_enable(self) -> int:
|
|
110
|
-
return int(self._status)
|
|
111
|
-
|
|
112
|
-
def get_cycle(self) -> dict:
|
|
113
|
-
return self._cycle
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
class ShutterKSC101Controller(ShutterKSC101Interface):
|
|
117
|
-
def __init__(self):
|
|
118
|
-
"""Initialize the Shutter KSC101 Controller interface."""
|
|
119
|
-
|
|
120
|
-
super().__init__()
|
|
121
|
-
|
|
122
|
-
logger.debug(f"Initializing Shutter KSC101 Controller")
|
|
123
|
-
|
|
124
|
-
try:
|
|
125
|
-
self.shutter = ShutterKSC101USBInterface()
|
|
126
|
-
self.shutter.connect()
|
|
127
|
-
|
|
128
|
-
except ShutterKSC101Error as exc:
|
|
129
|
-
logger.warning(f"KSC101Error caught: Couldn't establish connection ({exc})")
|
|
130
|
-
raise ShutterKSC101Error(
|
|
131
|
-
"Couldn't establish a connection with the Shutter KSC101 controller."
|
|
132
|
-
) from exc
|
|
133
|
-
|
|
134
|
-
# FIXME: connect and disconnect methods are not working properly
|
|
135
|
-
|
|
136
|
-
def connect(self):
|
|
137
|
-
"""Connects to the Shutter KSC101 device.
|
|
138
|
-
|
|
139
|
-
Raises:
|
|
140
|
-
DeviceNotFoundError: when the Shutter KSC101 device is not connected.
|
|
141
|
-
"""
|
|
142
|
-
try:
|
|
143
|
-
self.shutter.connect()
|
|
144
|
-
except ShutterKSC101Error as exc:
|
|
145
|
-
raise ConnectionError("Couldn't establish a connection with the Shutter KSC101 controller.") from exc
|
|
146
|
-
# if not self.shutter.is_connected():
|
|
147
|
-
# self.shutter.connect()
|
|
148
|
-
|
|
149
|
-
def disconnect(self):
|
|
150
|
-
try:
|
|
151
|
-
self.shutter.disconnect()
|
|
152
|
-
except ShutterKSC101Error as exc:
|
|
153
|
-
raise ConnectionError("Couldn't establish a connection with the Shutter KSC101 controller.") from exc
|
|
154
|
-
|
|
155
|
-
def reconnect(self):
|
|
156
|
-
if self.is_connected():
|
|
157
|
-
self.disconnect()
|
|
158
|
-
self.connect()
|
|
159
|
-
|
|
160
|
-
def is_simulator(self):
|
|
161
|
-
return False
|
|
162
|
-
|
|
163
|
-
def is_connected(self):
|
|
164
|
-
"""Check if the Shutter Controller is connected."""
|
|
165
|
-
return self.shutter.is_connected()
|
|
166
|
-
|
|
167
|
-
def get_response(self, cmd_string):
|
|
168
|
-
response = self.shutter.get_response(cmd_string)
|
|
169
|
-
return response
|
|
170
|
-
|
|
171
|
-
def set_mode(self, mode):
|
|
172
|
-
self.shutter.set_mode(mode)
|
|
173
|
-
|
|
174
|
-
def set_enable(self, status):
|
|
175
|
-
self.shutter.set_enable(status)
|
|
176
|
-
|
|
177
|
-
def set_cycle(self, on, off, number):
|
|
178
|
-
self.shutter.set_cycle(on, off, number)
|
|
179
|
-
|
|
180
|
-
def get_mode(self) -> int:
|
|
181
|
-
return self.shutter.get_mode()
|
|
182
|
-
|
|
183
|
-
def get_enable(self) -> int:
|
|
184
|
-
return self.shutter.get_enable()
|
|
185
|
-
|
|
186
|
-
def get_cycle(self) -> dict:
|
|
187
|
-
return self.shutter.get_cycle()
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
class ShutterKSC101Proxy(Proxy, ShutterKSC101Interface):
|
|
191
|
-
def __init__(
|
|
192
|
-
self,
|
|
193
|
-
protocol=CTRL_SETTINGS.PROTOCOL,
|
|
194
|
-
hostname=CTRL_SETTINGS.HOSTNAME,
|
|
195
|
-
port=CTRL_SETTINGS.COMMANDING_PORT,
|
|
196
|
-
):
|
|
197
|
-
"""
|
|
198
|
-
Args:
|
|
199
|
-
protocol: the transport protocol [default is taken from settings file]
|
|
200
|
-
hostname: location of the control server (IP address)
|
|
201
|
-
[default is taken from settings file]
|
|
202
|
-
port: TCP port on which the control server is listening for commands
|
|
203
|
-
[default is taken from settings file]
|
|
204
|
-
"""
|
|
205
|
-
super().__init__(connect_address(protocol, hostname, port))
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
BaseClass:
|
|
2
|
-
egse.shutter.thorlabs.ksc101.ShutterKSC101Interface
|
|
3
|
-
|
|
4
|
-
ProxyClass:
|
|
5
|
-
egse.shutter.thorlabs.ksc101.ShutterKSC101Proxy
|
|
6
|
-
|
|
7
|
-
ControlServerClass:
|
|
8
|
-
egse.shutter.thorlabs.ksc101_cs.ShutterKSC101ControlServer
|
|
9
|
-
|
|
10
|
-
ControlServer:
|
|
11
|
-
egse.shutter.thorlabs.ksc101_cs
|
|
12
|
-
|
|
13
|
-
UserInterface:
|
|
14
|
-
egse.shutter.thorlabs.ksc101_ui
|
|
15
|
-
|
|
16
|
-
Commands:
|
|
17
|
-
|
|
18
|
-
# Each of these groups is parsed and used on both the server and the client side.
|
|
19
|
-
# The group name (e.g. is_simulator) will be monkey patched in the Proxy class for the device or service.
|
|
20
|
-
# The other field are:
|
|
21
|
-
# description: Used by the doc_string method to generate a help string
|
|
22
|
-
# cmd: Command string that will eventually be send to the hardware controller for the
|
|
23
|
-
# device after the arguments have been filled.
|
|
24
|
-
# device_method: The name of the method to be called on the device class.
|
|
25
|
-
# These should all be defined by the base class for the device, i.e. LakeShoreBase.
|
|
26
|
-
# response: The name of the method to be called from the device protocol.
|
|
27
|
-
# This method should exist in the subclass of the CommandProtocol base class, i.e.
|
|
28
|
-
# in this case it will be the LakeShoreProtocol class.
|
|
29
|
-
|
|
30
|
-
# Definition of the the DeviceInterface
|
|
31
|
-
|
|
32
|
-
disconnect:
|
|
33
|
-
description: Disconnect from the Shutter controller. This command will be send to the
|
|
34
|
-
Thorlabs Control Server which will then disconnect from the hardware controller.
|
|
35
|
-
This command doesn't affect the ZeroMQ connection of this Proxy to the
|
|
36
|
-
control server. Use the service command ``disconnect_cs()`` to disconnect
|
|
37
|
-
from the control server.
|
|
38
|
-
|
|
39
|
-
connect:
|
|
40
|
-
description: Connect to the Thorlabs Shutter.
|
|
41
|
-
|
|
42
|
-
reconnect:
|
|
43
|
-
description: Reconnect to the Thorlabs Shutter.
|
|
44
|
-
|
|
45
|
-
This command will force a disconnect and then try to re-connect to the controller.
|
|
46
|
-
|
|
47
|
-
is_simulator:
|
|
48
|
-
description: Ask if the control server is a simulator instead of the real ShutterKSC01Controller class.
|
|
49
|
-
returns: bool | True if the far end is a simulator instead of the real hardware
|
|
50
|
-
|
|
51
|
-
is_connected:
|
|
52
|
-
description: Check if the Thorlabs Hardware Controller is connected.
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
# Definition of the device commands
|
|
56
|
-
|
|
57
|
-
set_mode:
|
|
58
|
-
description: Sets the KSC101 control mode.
|
|
59
|
-
Manual - In this mode, operation of the solenoid is via the top panel wheel.Move the wheel up to
|
|
60
|
-
open the solenoid (ON) and down to close (OFF).
|
|
61
|
-
Single - In this mode, the solenoid will open/close each time the top panel wheel ismoved up/down.
|
|
62
|
-
Auto - In this mode, the solenoid will open and close continuously after the toppanel wheel is
|
|
63
|
-
moved up. The ON and OFF times, and the number of cyclesperformed
|
|
64
|
-
Trigger - The K-Cube solenoid controllers have two bidirectional trigger ports(TRIG1 and TRIG2)
|
|
65
|
-
that can be used to read an external logic signal or outputa logic level to control external
|
|
66
|
-
equipment. By default, TRIG 1 is configured asan input and TRIG 2 as an output.
|
|
67
|
-
The active logic state can be selected Highor Low to suit the requirements of the application
|
|
68
|
-
args:
|
|
69
|
-
mode: str | Available modes are "Manual", "Single", "Auto", "Trigger"
|
|
70
|
-
cmd: "{mode}"
|
|
71
|
-
returns: None
|
|
72
|
-
|
|
73
|
-
set_enable:
|
|
74
|
-
description: This message sets the output state of the solenoid unit, and overrides any existing settings.
|
|
75
|
-
It can also be operated by the SET_CHANENABLESTATE message.
|
|
76
|
-
args:
|
|
77
|
-
status: bool | True = open, False = closed
|
|
78
|
-
cmd: "{status}"
|
|
79
|
-
returns: None
|
|
80
|
-
|
|
81
|
-
set_cycle:
|
|
82
|
-
description: Used to set the cycle parameters (On time, Off time, and number of cycles) that are applicable when
|
|
83
|
-
the solenoid controller is operating in one of the non‐manual modes (Single and Automatic mode
|
|
84
|
-
operations).
|
|
85
|
-
args:
|
|
86
|
-
on: int | The duration of an on (open) state of the solenoid in ms ()
|
|
87
|
-
off: int | The duration of an off (closed) state of the solenoid in ms ().
|
|
88
|
-
number: int | The number of cycles from 0 to . If 0 is set then infinity cycles are foreseen in automatic
|
|
89
|
-
mode, the cycling can then be stopped with the set_enable command.
|
|
90
|
-
cmd: "{on} {off} {number}"
|
|
91
|
-
returns: None
|
|
92
|
-
|
|
93
|
-
get_mode:
|
|
94
|
-
description: Retrieves the operating control mode of the KSC101 Controller.
|
|
95
|
-
returns: int | 1 = manual, 2 = single, 3 = auto, 4 = trigger, None = error
|
|
96
|
-
|
|
97
|
-
get_enable:
|
|
98
|
-
description: Retrieves the shutter solenoid status.
|
|
99
|
-
returns: int | 1 = enabled (open); 0 = disabled (closed)
|
|
100
|
-
|
|
101
|
-
get_cycle:
|
|
102
|
-
description: Retrives the the cycle parameters (On time, Off time, and number of cycles) that are applicable when
|
|
103
|
-
the solenoid controller is operating in one of the non‐manual modes (Single and Automatic mode
|
|
104
|
-
operations).
|
|
105
|
-
returns: dict |
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import argparse
|
|
2
|
-
import click
|
|
3
|
-
import logging
|
|
4
|
-
import sys
|
|
5
|
-
import zmq
|
|
6
|
-
|
|
7
|
-
from egse.control import ControlServer
|
|
8
|
-
from egse.settings import Settings
|
|
9
|
-
from egse.shutter.thorlabs.ksc101 import ShutterKSC101Proxy
|
|
10
|
-
|
|
11
|
-
from egse.shutter.thorlabs.ksc101_protocol import ShutterKSC101Protocol
|
|
12
|
-
|
|
13
|
-
from prometheus_client import start_http_server
|
|
14
|
-
|
|
15
|
-
logging.basicConfig(level=logging.DEBUG, format=Settings.LOG_FORMAT_FULL)
|
|
16
|
-
|
|
17
|
-
logger = logging.getLogger("KSC101 CS")
|
|
18
|
-
|
|
19
|
-
# Restrict the logging output for the following loggers.
|
|
20
|
-
|
|
21
|
-
# Note that, in production, the logging level for the different loggers can be changed with a
|
|
22
|
-
# service command `set_logging_level(logger_name, level)`.
|
|
23
|
-
|
|
24
|
-
logger_levels = [
|
|
25
|
-
("egse.protocol", logging.INFO),
|
|
26
|
-
("egse.command", logging.INFO),
|
|
27
|
-
("egse.settings", logging.INFO),
|
|
28
|
-
]
|
|
29
|
-
|
|
30
|
-
for name, level in logger_levels:
|
|
31
|
-
logger = logging.getLogger(name)
|
|
32
|
-
logger.setLevel(level)
|
|
33
|
-
|
|
34
|
-
CTRL_SETTINGS = Settings.load("Shutter KSC101 Control Server")
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
class ShutterKSC101ControlServer(ControlServer):
|
|
38
|
-
"""
|
|
39
|
-
ThorlabsControlServer - Command and monitor the Shutter KSC101 Controllers.
|
|
40
|
-
|
|
41
|
-
This class works as a command and monitoring server to control the Shutter Controller remotely.
|
|
42
|
-
|
|
43
|
-
The sever binds to the following ZeroMQ sockets:
|
|
44
|
-
|
|
45
|
-
* a REQ-REP socket that can be used as a command server. Any client can connect and
|
|
46
|
-
send a command to the Thorlabs controller.
|
|
47
|
-
|
|
48
|
-
* a PUB-SUP socket that serves as a monitoring server. It will send out Thorlabs status
|
|
49
|
-
information to all the connected clients every DELAY seconds.
|
|
50
|
-
|
|
51
|
-
"""
|
|
52
|
-
|
|
53
|
-
def __init__(self):
|
|
54
|
-
super().__init__()
|
|
55
|
-
|
|
56
|
-
self.device_protocol = ShutterKSC101Protocol(self)
|
|
57
|
-
|
|
58
|
-
self.logger.debug(f"Binding ZeroMQ socket to {self.device_protocol.get_bind_address()}")
|
|
59
|
-
|
|
60
|
-
self.device_protocol.bind(self.dev_ctrl_cmd_sock)
|
|
61
|
-
|
|
62
|
-
self.poller.register(self.dev_ctrl_cmd_sock, zmq.POLLIN)
|
|
63
|
-
|
|
64
|
-
def get_communication_protocol(self):
|
|
65
|
-
return CTRL_SETTINGS.PROTOCOL
|
|
66
|
-
|
|
67
|
-
def get_commanding_port(self):
|
|
68
|
-
return CTRL_SETTINGS.COMMANDING_PORT
|
|
69
|
-
|
|
70
|
-
def get_service_port(self):
|
|
71
|
-
return CTRL_SETTINGS.SERVICE_PORT
|
|
72
|
-
|
|
73
|
-
def get_monitoring_port(self):
|
|
74
|
-
return CTRL_SETTINGS.MONITORING_PORT
|
|
75
|
-
|
|
76
|
-
def get_storage_mnemonic(self):
|
|
77
|
-
try:
|
|
78
|
-
return CTRL_SETTINGS.STORAGE_MNEMONIC
|
|
79
|
-
except AttributeError:
|
|
80
|
-
return "KSC101"
|
|
81
|
-
|
|
82
|
-
def before_serve(self):
|
|
83
|
-
start_http_server(CTRL_SETTINGS.METRICS_PORT)
|
|
84
|
-
|
|
85
|
-
@click.group()
|
|
86
|
-
def cli():
|
|
87
|
-
pass
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
@cli.command()
|
|
91
|
-
@click.option("--simulator", "--sim", is_flag=True, help="Start the Thorlabs KSC101 Shutter Simulator as the backend.")
|
|
92
|
-
def start(simulator):
|
|
93
|
-
"""Start the Thorlabs KSC101 Shutter Control Server."""
|
|
94
|
-
|
|
95
|
-
if simulator:
|
|
96
|
-
|
|
97
|
-
Settings.set_simulation_mode(True)
|
|
98
|
-
|
|
99
|
-
try:
|
|
100
|
-
|
|
101
|
-
controller = ShutterKSC101ControlServer()
|
|
102
|
-
controller.serve()
|
|
103
|
-
|
|
104
|
-
except KeyboardInterrupt:
|
|
105
|
-
|
|
106
|
-
print("Shutdown requested...exiting")
|
|
107
|
-
|
|
108
|
-
except SystemExit as exit_code:
|
|
109
|
-
|
|
110
|
-
print("System Exit with code {}.".format(exit_code))
|
|
111
|
-
sys.exit(exit_code)
|
|
112
|
-
|
|
113
|
-
except Exception:
|
|
114
|
-
|
|
115
|
-
logger.exception("Cannot start the Thorlabs KSC101 Shutter Control Server")
|
|
116
|
-
|
|
117
|
-
# The above line does exactly the same as the traceback, but on the logger
|
|
118
|
-
# import traceback
|
|
119
|
-
# traceback.print_exc(file=sys.stdout)
|
|
120
|
-
|
|
121
|
-
return 0
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
@cli.command()
|
|
125
|
-
def stop():
|
|
126
|
-
"""Send a 'quit_server' command to the Thorlabs KSC101 Shutter Control Server."""
|
|
127
|
-
|
|
128
|
-
with ShutterKSC101Proxy() as proxy:
|
|
129
|
-
|
|
130
|
-
sp = proxy.get_service_proxy()
|
|
131
|
-
sp.quit_server()
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if __name__ == "__main__":
|
|
135
|
-
|
|
136
|
-
sys.exit(cli())
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import struct
|
|
3
|
-
import time
|
|
4
|
-
|
|
5
|
-
import pylibftdi
|
|
6
|
-
from pylibftdi import USB_VID_LIST, USB_PID_LIST
|
|
7
|
-
|
|
8
|
-
USB_PID_LIST.append(0xfaf0) #adds shutter PID to the USB PID List
|
|
9
|
-
|
|
10
|
-
from egse.command import ClientServerCommand
|
|
11
|
-
from egse.exceptions import DeviceNotFoundError
|
|
12
|
-
from egse.settings import Settings
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
ctrl_settings = Settings.load("Shutter KSC101 Controller")
|
|
16
|
-
|
|
17
|
-
# TODO:
|
|
18
|
-
# Add functions to retrieve the controller info and the interlock/error state
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class ShutterKSC101Error(Exception):
|
|
22
|
-
"""Base exception for all Shutter errors."""
|
|
23
|
-
pass
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class ShutterKSC101Command(ClientServerCommand):
|
|
27
|
-
def get_cmd_string(self, *args, **kwargs) -> str:
|
|
28
|
-
out = super().get_cmd_string(*args, **kwargs)
|
|
29
|
-
return out + "\n"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class ShutterKSC101USBInterface:
|
|
33
|
-
|
|
34
|
-
def __init__(self):
|
|
35
|
-
|
|
36
|
-
self._shutter = None
|
|
37
|
-
self.baudrate = ctrl_settings.BAUDRATE
|
|
38
|
-
self.device_id = ctrl_settings.DEVICE_ID
|
|
39
|
-
self._is_connected = False
|
|
40
|
-
|
|
41
|
-
self._modes = {"manual": 0x01, "single": 0x02, "auto": 0x03, "trigger": 0x04}
|
|
42
|
-
|
|
43
|
-
def connect(self):
|
|
44
|
-
try:
|
|
45
|
-
# device mode 't' is latin-1 encoding, to be used later for unpacking the message reads
|
|
46
|
-
# you added PID and VID to the list of devices of pylibftdi as suggested by
|
|
47
|
-
# https://pylibftdi.readthedocs.io/en/latest/how_to.html
|
|
48
|
-
self._shutter = pylibftdi.Device(mode = 't', device_id = self.device_id)
|
|
49
|
-
|
|
50
|
-
# Steps to perform from APT Communication Protocol section 2.1:
|
|
51
|
-
# Baud rate = 115200
|
|
52
|
-
self._shutter.baudrate = self.baudrate
|
|
53
|
-
|
|
54
|
-
# 8 data bits, 1 stop bit, no parity
|
|
55
|
-
self._shutter.ftdi_fn.ftdi_set_line_property(8, 1, 0)
|
|
56
|
-
|
|
57
|
-
# Pre purge dwell 50 ms
|
|
58
|
-
time.sleep(50.0 / 1000)
|
|
59
|
-
|
|
60
|
-
# Purge the device
|
|
61
|
-
self._shutter.flush(pylibftdi.FLUSH_BOTH)
|
|
62
|
-
|
|
63
|
-
# Post purge dwell 50 ms
|
|
64
|
-
time.sleep(50.0 / 1000)
|
|
65
|
-
|
|
66
|
-
# Set flow control to RTS/CTS
|
|
67
|
-
SIO_RTS_CTS_HS = (0x1 << 8)
|
|
68
|
-
self._shutter.ftdi_fn.ftdi_setflowctrl(SIO_RTS_CTS_HS) # returns 0 if OK
|
|
69
|
-
|
|
70
|
-
# Set RTS
|
|
71
|
-
self._shutter.ftdi_fn.ftdi_setrts(1) # returns 0 if OK
|
|
72
|
-
|
|
73
|
-
except (ValueError, Exception) as exc:
|
|
74
|
-
logger.warning(f"Could not open USB FTDI device: {exc}")
|
|
75
|
-
raise DeviceNotFoundError("Could not open USB FTDI device.") from exc
|
|
76
|
-
|
|
77
|
-
self._is_connected = True
|
|
78
|
-
|
|
79
|
-
def disconnect(self):
|
|
80
|
-
try:
|
|
81
|
-
if self._is_connected:
|
|
82
|
-
logger.debug(f'Disconnecting from {self.device_id}')
|
|
83
|
-
self._shutter.close()
|
|
84
|
-
self._is_connected = False
|
|
85
|
-
except Exception as e_exc:
|
|
86
|
-
raise ShutterKSC101Error(f"Could not close {self.device_id}") from e_exc
|
|
87
|
-
|
|
88
|
-
# if not self._shutter.closed:
|
|
89
|
-
# self._shutter.close()
|
|
90
|
-
# else:
|
|
91
|
-
# pass
|
|
92
|
-
# self.is_connected = False
|
|
93
|
-
|
|
94
|
-
def is_connected(self):
|
|
95
|
-
"""Return True if the device is connected."""
|
|
96
|
-
|
|
97
|
-
if not self._is_connected:
|
|
98
|
-
return False
|
|
99
|
-
try:
|
|
100
|
-
self.get_id()
|
|
101
|
-
except OSError: # FIXME: Check which errors are actually thrown here
|
|
102
|
-
self.disconnect()
|
|
103
|
-
return False
|
|
104
|
-
|
|
105
|
-
return True
|
|
106
|
-
|
|
107
|
-
def get_id(self):
|
|
108
|
-
return('To be implemented')
|
|
109
|
-
|
|
110
|
-
def info(self):
|
|
111
|
-
return f"Thorlabs KSC101 Shutter Controller: {self.get_id()}."
|
|
112
|
-
|
|
113
|
-
def get_response(self, cmd_string):
|
|
114
|
-
logger.debug(f"get_response() called with {cmd_string}")
|
|
115
|
-
return NotImplemented
|
|
116
|
-
|
|
117
|
-
def send_message(self, m):
|
|
118
|
-
"Sends the packed message to the KSC101 Controller"
|
|
119
|
-
self._shutter.write(m.pack())
|
|
120
|
-
|
|
121
|
-
def set_mode(self, mode):
|
|
122
|
-
if mode in self._modes.keys():
|
|
123
|
-
tx = struct.pack('HBBBB', 0x04C0, 0x01, self._modes[mode], 0x50, 0x01)
|
|
124
|
-
self._shutter.write(tx)
|
|
125
|
-
else:
|
|
126
|
-
print("Error, command not executed")
|
|
127
|
-
#TODO:ask Rik how to handle this error
|
|
128
|
-
|
|
129
|
-
def set_cycle(self, on, off, number):
|
|
130
|
-
|
|
131
|
-
tx = struct.pack('<HHBBBBLLL', 0x04C3, 0x000E, 0xD0, 0x01, 0x01, 0x00, on, off, number)
|
|
132
|
-
self._shutter.write(tx)
|
|
133
|
-
|
|
134
|
-
def set_enable(self, state):
|
|
135
|
-
if state:
|
|
136
|
-
parameter = 0x01 # Open
|
|
137
|
-
if not state:
|
|
138
|
-
parameter = 0x02 # Closed
|
|
139
|
-
tx = struct.pack('HBBBB', 0x04CB, 0x01, parameter, 0x50, 0x01)
|
|
140
|
-
self._shutter.write(tx)
|
|
141
|
-
#TODO: write else condition to avoid wrong parameter value
|
|
142
|
-
|
|
143
|
-
##### TELEMETRY
|
|
144
|
-
# Apart from the last two categories (status update messages and error messages), in general
|
|
145
|
-
# the message exchanges follow the SET ‐> REQUEST ‐> GET pattern, i.e. for most commands a
|
|
146
|
-
# trio of messages are defined. The SET part of the trio is used by the host (or, sometimes in
|
|
147
|
-
# card‐slot systems the motherboard) to set some parameter or other. If then the host
|
|
148
|
-
# requires some information from the sub‐module, then it may send a REQUEST for this
|
|
149
|
-
# information, and the sub‐module responds with the GET part of the command. Obviously,
|
|
150
|
-
# there are cases when this general scheme does not apply and some part of this message trio
|
|
151
|
-
# is not defined. For consistency, in the description of the messages this SET‐>REQUEST‐>GET
|
|
152
|
-
# scheme will be used throughout.
|
|
153
|
-
|
|
154
|
-
# FIXME:
|
|
155
|
-
# The shutter gets stuck if I follow the documentation from the Manual: Note that,
|
|
156
|
-
# as the scheme suggests, this is a master‐slave type of system, so sub‐modules
|
|
157
|
-
|
|
158
|
-
def get_enable(self):
|
|
159
|
-
tx = struct.pack('HBBBB', 0x04CB, 0x01, 0x00, 0x50, 0x01) # requests enable state
|
|
160
|
-
self._shutter.write(tx)
|
|
161
|
-
rx = struct.pack('HBBBB', 0x04CC, 0x01, 0x01, 0x50, 0x01) # gets enable state
|
|
162
|
-
self._shutter.write(rx)
|
|
163
|
-
|
|
164
|
-
time.sleep(50.0 / 1000) #wait time needed between write and read
|
|
165
|
-
|
|
166
|
-
_enable = bytes(self._shutter.read(6), "latin -1") # gets the 6 read bytes
|
|
167
|
-
return _enable[3]
|
|
168
|
-
|
|
169
|
-
def get_mode(self):
|
|
170
|
-
tx = struct.pack('HBBBB', 0x04C1, 0x01, 0x00, 0x50, 0x01) # requests enable state
|
|
171
|
-
self._shutter.write(tx)
|
|
172
|
-
rx = struct.pack('HBBBB', 0x04C2, 0x01, 0x01, 0x50, 0x01) # gets enable state
|
|
173
|
-
self._shutter.write(rx)
|
|
174
|
-
|
|
175
|
-
time.sleep(50.0 / 1000) #wait time needed between write and read
|
|
176
|
-
|
|
177
|
-
_mode = bytes(self._shutter.read(6), "latin -1") # gets the 6 read bytes
|
|
178
|
-
|
|
179
|
-
if _mode[3] in self._modes.values(): # byte 4 gets the mode status
|
|
180
|
-
mode = _mode[3]
|
|
181
|
-
else:
|
|
182
|
-
mode = None
|
|
183
|
-
return mode
|
|
184
|
-
#FIXME: put a case in which _mode is empty to prevent errors
|
|
185
|
-
|
|
186
|
-
def get_cycle(self):
|
|
187
|
-
tx = struct.pack('HBBBB',0x04C4,0x01,0x00,0x50,0x01) # requests enable state
|
|
188
|
-
self._shutter.write(tx)
|
|
189
|
-
rx = struct.pack('HBBBB',0x04C5,0x01,0x01,0x50,0x01) # gets enable state
|
|
190
|
-
self._shutter.write(rx)
|
|
191
|
-
|
|
192
|
-
time.sleep(50.0 / 1000) #wait time needed between write and read
|
|
193
|
-
# gets 20 bytes
|
|
194
|
-
_cycle = bytes(self._shutter.read(20), "latin -1") # gets the 20 read bytes
|
|
195
|
-
|
|
196
|
-
# gets the 3 parameters coded in 4 bytes (long) little endian each
|
|
197
|
-
on = struct.unpack('<L',_cycle[8:12])
|
|
198
|
-
off = struct.unpack('<L',_cycle[12:16])
|
|
199
|
-
number = struct.unpack('<L',_cycle[16:])
|
|
200
|
-
|
|
201
|
-
return {"Ontime": on[0],"Offtime": off[0], "Number of cycles": number[0]}
|