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/stages/huber/smc9300_sim.py
DELETED
|
@@ -1,547 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module provides a simple simulator for the HUBER stages SMC9300.
|
|
3
|
-
|
|
4
|
-
The difference between this simulator and the HuberSMC9300Simulator class is that this module is a
|
|
5
|
-
standalone process that will accept the command set as accepted by the SMC9300 device controller,
|
|
6
|
-
while the HuberSMC9300Simulator class replaces the Huber9300Controller and never communicates
|
|
7
|
-
with a device.
|
|
8
|
-
|
|
9
|
-
This simulator is a very simple implementation. It responds to a number of known commands with
|
|
10
|
-
little to no intelligence behind it.
|
|
11
|
-
|
|
12
|
-
Known commands are:
|
|
13
|
-
|
|
14
|
-
* version - returns a version string
|
|
15
|
-
|
|
16
|
-
Usage:
|
|
17
|
-
|
|
18
|
-
$ smc9300_sim start
|
|
19
|
-
|
|
20
|
-
"""
|
|
21
|
-
from __future__ import annotations
|
|
22
|
-
|
|
23
|
-
import multiprocessing.process
|
|
24
|
-
import textwrap
|
|
25
|
-
import time
|
|
26
|
-
from typing import Optional
|
|
27
|
-
|
|
28
|
-
from egse.settings import Settings
|
|
29
|
-
|
|
30
|
-
multiprocessing.current_process().name = "smc9300_sim"
|
|
31
|
-
|
|
32
|
-
import logging
|
|
33
|
-
import re
|
|
34
|
-
import socket
|
|
35
|
-
from enum import Enum
|
|
36
|
-
|
|
37
|
-
import click
|
|
38
|
-
|
|
39
|
-
logging.basicConfig(level=logging.DEBUG)
|
|
40
|
-
|
|
41
|
-
LOGGER = logging.getLogger("egse.stages.huber.smc9300_sim")
|
|
42
|
-
|
|
43
|
-
HOST = "localhost"
|
|
44
|
-
STAGES_SETTINGS = Settings.load("Huber Controller")
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class InvalidStateError(Exception):
|
|
48
|
-
pass
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def write(conn, response: str) -> None:
|
|
52
|
-
"""
|
|
53
|
-
Writes a response string on the socket connection.
|
|
54
|
-
|
|
55
|
-
Args:
|
|
56
|
-
conn: the socket that is used for communication
|
|
57
|
-
response: the response of the previous command
|
|
58
|
-
|
|
59
|
-
Returns:
|
|
60
|
-
None.
|
|
61
|
-
"""
|
|
62
|
-
response = f"{response}\r\n".encode()
|
|
63
|
-
# LOGGER.debug(f"{response=}")
|
|
64
|
-
conn.sendall(response)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
def read(conn) -> str:
|
|
68
|
-
"""
|
|
69
|
-
Reads one command string from the socket, i.e. until a linefeed ('\n') is received.
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
The command string with the linefeed stripped off.
|
|
73
|
-
"""
|
|
74
|
-
|
|
75
|
-
idx, n_total = 0, 0
|
|
76
|
-
buf_size = 1024 * 4
|
|
77
|
-
command_string = bytes()
|
|
78
|
-
|
|
79
|
-
try:
|
|
80
|
-
for _ in range(100):
|
|
81
|
-
data = conn.recv(buf_size)
|
|
82
|
-
n = len(data)
|
|
83
|
-
n_total += n
|
|
84
|
-
command_string += data
|
|
85
|
-
# if data.endswith(b'\n'):
|
|
86
|
-
if n < buf_size:
|
|
87
|
-
break
|
|
88
|
-
except socket.timeout as e_timeout:
|
|
89
|
-
LOGGER.warning(f"Socket timeout error from {e_timeout}")
|
|
90
|
-
return ""
|
|
91
|
-
|
|
92
|
-
# LOGGER.debug(f"Total number of bytes received is {n_total}, idx={idx}")
|
|
93
|
-
# LOGGER.debug(f"{command_string=}")
|
|
94
|
-
|
|
95
|
-
return command_string.decode().rstrip()
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
class AxisTimer:
|
|
99
|
-
"""
|
|
100
|
-
This class controls all the timings of an axis.
|
|
101
|
-
"""
|
|
102
|
-
|
|
103
|
-
def __init__(self):
|
|
104
|
-
self._start_time = time.time()
|
|
105
|
-
self._running = False
|
|
106
|
-
|
|
107
|
-
def is_running(self):
|
|
108
|
-
return self._running
|
|
109
|
-
|
|
110
|
-
def start(self):
|
|
111
|
-
"""Start the timer."""
|
|
112
|
-
self._start_time = time.time()
|
|
113
|
-
self._running = True
|
|
114
|
-
|
|
115
|
-
def stop(self):
|
|
116
|
-
"""Stop the timer."""
|
|
117
|
-
self._start_time = time.time()
|
|
118
|
-
self._running = False
|
|
119
|
-
|
|
120
|
-
def get_delta_time(self) -> float:
|
|
121
|
-
"""
|
|
122
|
-
Returns the delta time since the start() method was called on this
|
|
123
|
-
AxisTimer.
|
|
124
|
-
|
|
125
|
-
:returns: delta time in seconds since the start of the timer
|
|
126
|
-
"""
|
|
127
|
-
return time.time() - self._start_time if self._running else 0.0
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
class Axis:
|
|
131
|
-
"""
|
|
132
|
-
This class controls the settings and movements of one particular axis
|
|
133
|
-
for the HUBER Stages.
|
|
134
|
-
|
|
135
|
-
Do not use this class directly, it is used from within the HuberSimulator.
|
|
136
|
-
"""
|
|
137
|
-
|
|
138
|
-
def __init__(self, slew_speed, encoder_conversion, alias, type_):
|
|
139
|
-
# Translation Stage: slew_speed = 77_200, encoder_conversion = 20_000
|
|
140
|
-
# Big Rotation: slew_speed = 22_943_316, encoder_conversion = 11_930_500
|
|
141
|
-
self._alias = alias
|
|
142
|
-
self._type = type_
|
|
143
|
-
self._slew_speed = slew_speed # 1e-4 deg per second -> 15_000 is 1.5 deg/s
|
|
144
|
-
self._encoder_conversion_factor = encoder_conversion # encoder positions per mm/deg
|
|
145
|
-
self._encoder_counter_offset = 4287251092
|
|
146
|
-
self._encoder_position = 0.0
|
|
147
|
-
self._current_position = 0.0
|
|
148
|
-
self._start_position = 0.0
|
|
149
|
-
self._edev = 0.001
|
|
150
|
-
self._edir = 0
|
|
151
|
-
self._frun = 0
|
|
152
|
-
self._commanded_position = None
|
|
153
|
-
self._moving = False
|
|
154
|
-
self._distance = 0
|
|
155
|
-
self._direction = 0
|
|
156
|
-
self._timer = AxisTimer()
|
|
157
|
-
self._biss_t = 360 if self._type == 0 else 0
|
|
158
|
-
|
|
159
|
-
self._unit = "deg" if self._type == 0 else "mm"
|
|
160
|
-
|
|
161
|
-
@property
|
|
162
|
-
def alias(self):
|
|
163
|
-
return self._alias
|
|
164
|
-
|
|
165
|
-
@property
|
|
166
|
-
def type(self):
|
|
167
|
-
return self._type
|
|
168
|
-
|
|
169
|
-
@property
|
|
170
|
-
def unit(self):
|
|
171
|
-
return self._unit
|
|
172
|
-
|
|
173
|
-
@property
|
|
174
|
-
def ffast(self):
|
|
175
|
-
return self._slew_speed
|
|
176
|
-
|
|
177
|
-
@property
|
|
178
|
-
def frun(self):
|
|
179
|
-
return self._frun
|
|
180
|
-
|
|
181
|
-
@property
|
|
182
|
-
def edev(self):
|
|
183
|
-
return self._edev
|
|
184
|
-
|
|
185
|
-
@edev.setter
|
|
186
|
-
def edev(self, value: float):
|
|
187
|
-
self._edev = value
|
|
188
|
-
|
|
189
|
-
@property
|
|
190
|
-
def edir(self):
|
|
191
|
-
return self._edir
|
|
192
|
-
|
|
193
|
-
@edir.setter
|
|
194
|
-
def edir(self, value: int):
|
|
195
|
-
# value can be 0 or 1 only
|
|
196
|
-
self._edir = value
|
|
197
|
-
|
|
198
|
-
def get_slew_speed(self) -> int:
|
|
199
|
-
return self._slew_speed
|
|
200
|
-
|
|
201
|
-
def set_slew_speed(self, speed: int):
|
|
202
|
-
self._slew_speed = speed
|
|
203
|
-
|
|
204
|
-
def get_converted_slew_speed(self) -> float:
|
|
205
|
-
"""Returns the slew speed in mm/s or deg/s"""
|
|
206
|
-
return self._slew_speed * 1e-4
|
|
207
|
-
|
|
208
|
-
def get_state(self) -> int:
|
|
209
|
-
return 0 if self._moving else 129
|
|
210
|
-
|
|
211
|
-
def start(self):
|
|
212
|
-
"""
|
|
213
|
-
Start a movement. A movement is defined as the change from the current
|
|
214
|
-
position to the commanded position. Therefore, the start position will
|
|
215
|
-
be set to the current position and all calculations including time will
|
|
216
|
-
be with respect to the starting position.
|
|
217
|
-
"""
|
|
218
|
-
if self._commanded_position is None:
|
|
219
|
-
raise InvalidStateError("Can not start a movement if commanded position is not set.")
|
|
220
|
-
|
|
221
|
-
self._timer.start()
|
|
222
|
-
self._moving = True
|
|
223
|
-
self._distance = self._current_position - self._commanded_position
|
|
224
|
-
self._direction = 1 if self._commanded_position > self._current_position else -1
|
|
225
|
-
self._start_position = self._current_position
|
|
226
|
-
|
|
227
|
-
def stop(self):
|
|
228
|
-
"""
|
|
229
|
-
Stop a movement by
|
|
230
|
-
|
|
231
|
-
"""
|
|
232
|
-
self._moving = False
|
|
233
|
-
self._timer.stop()
|
|
234
|
-
|
|
235
|
-
def set_commanded_position(self, position):
|
|
236
|
-
self._commanded_position = position
|
|
237
|
-
|
|
238
|
-
def get_current_position(self) -> float:
|
|
239
|
-
self._calc_current_position()
|
|
240
|
-
return self._current_position
|
|
241
|
-
|
|
242
|
-
def get_encoder_position(self) -> float:
|
|
243
|
-
return self.get_current_position() # add some noise here
|
|
244
|
-
|
|
245
|
-
def get_encoder_counter_value(self) -> int:
|
|
246
|
-
return self._encoder_counter_offset + int(self.get_encoder_position() * self._encoder_conversion_factor)
|
|
247
|
-
|
|
248
|
-
def is_in_position(self) -> bool:
|
|
249
|
-
self._calc_current_position()
|
|
250
|
-
return not self._moving
|
|
251
|
-
|
|
252
|
-
def _calc_current_position(self):
|
|
253
|
-
if not self._moving:
|
|
254
|
-
return
|
|
255
|
-
|
|
256
|
-
delta_t = self._timer.get_delta_time()
|
|
257
|
-
slew_speed = self.get_converted_slew_speed()
|
|
258
|
-
travel = slew_speed * delta_t
|
|
259
|
-
|
|
260
|
-
# LOGGER.info(f"{delta_t=}, {slew_speed=}, {travel=}")
|
|
261
|
-
|
|
262
|
-
if travel >= abs(self._distance):
|
|
263
|
-
self._current_position = self._commanded_position
|
|
264
|
-
self._moving = False
|
|
265
|
-
self._distance = 0.0
|
|
266
|
-
else:
|
|
267
|
-
self._current_position = self._start_position + travel * self._direction
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
class OnOff(str, Enum):
|
|
271
|
-
|
|
272
|
-
ON = "ON"
|
|
273
|
-
OFF = "OFF"
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
class State:
|
|
277
|
-
def __init__(self, axis: int):
|
|
278
|
-
self.axis = axis
|
|
279
|
-
self.errors = []
|
|
280
|
-
self.slew_speed = 20_000
|
|
281
|
-
self.current_position = 270
|
|
282
|
-
self.current_encoder_position = 271
|
|
283
|
-
self.current_encoder_counter = 272_000
|
|
284
|
-
self.controller_ready = True
|
|
285
|
-
self.is_connected = False
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
# The slew_speed and the encoder_conversion factor is empirically determined from the
|
|
289
|
-
# hardware measures between 0 and 100. The timings that result for these stages are
|
|
290
|
-
# only approximately correct.
|
|
291
|
-
|
|
292
|
-
axes = [
|
|
293
|
-
None,
|
|
294
|
-
Axis(22_943_316, 11_930_500, alias="01~rot (420-20913)", type_=0),
|
|
295
|
-
Axis(20_000, 20_000, alias="02~rot (409-10661)", type_=0),
|
|
296
|
-
Axis(77_200, 20_000, alias="03~lin (5101.30-943)", type_=1),
|
|
297
|
-
]
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
states = [None, State(1), State(2), State(3)]
|
|
301
|
-
|
|
302
|
-
error_msg = ""
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
def get_configuration(axis: str) -> str:
|
|
306
|
-
axis = int(axis)
|
|
307
|
-
response = (
|
|
308
|
-
f"# configuration settings of axis {axis}\r\n"
|
|
309
|
-
f"alias{axis}:{axes[axis].alias}\r\n"
|
|
310
|
-
f"type{axis}:{axes[axis].type}\r\n"
|
|
311
|
-
f"unit{axis}:{axes[axis].unit}\r\n"
|
|
312
|
-
f"ffast{axis}:{axes[axis].ffast}\r\n"
|
|
313
|
-
f"frun{axis}:{axes[axis].frun}\r\n"
|
|
314
|
-
f"gnum{axis}:10000\r\n"
|
|
315
|
-
f"biss_t{axis}:{axes[axis]._biss_t}" # last line doesn't have a \r\n, will be added later
|
|
316
|
-
)
|
|
317
|
-
return response
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
def cancel_movement(axis: Optional[str] = None):
|
|
321
|
-
|
|
322
|
-
if axis is None:
|
|
323
|
-
for axis in axes:
|
|
324
|
-
axis and axis.stop()
|
|
325
|
-
else:
|
|
326
|
-
axes[int(axis)].stop()
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
def clear_error(axis: str) -> None:
|
|
330
|
-
states[int(axis)].errors = []
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
def get_error(axis: str) -> str:
|
|
334
|
-
return f"{axis}:0"
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
def get_parameter(par_name: str, axis: str) -> str:
|
|
338
|
-
# LOGGER.info(f"get_parameter({par_name=}, {axis=})")
|
|
339
|
-
if par_name == "edev":
|
|
340
|
-
return f"{par_name}{axis}:{axes[int(axis)].edev}"
|
|
341
|
-
elif par_name == "edir":
|
|
342
|
-
return f"{par_name}{axis}:{axes[int(axis)].edir}"
|
|
343
|
-
elif par_name == "ffast":
|
|
344
|
-
return f"{par_name}{axis}:{axes[int(axis)].ffast}"
|
|
345
|
-
elif par_name == "frun":
|
|
346
|
-
return f"{par_name}{axis}:{axes[int(axis)].frun}"
|
|
347
|
-
|
|
348
|
-
return f"{par_name}{axis}:0"
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
def set_parameter(par_name: str, axis: str, value: int | float):
|
|
352
|
-
# LOGGER.info(f"set_parameter({par_name=}, {axis=}, {value=}")
|
|
353
|
-
if par_name == "edev":
|
|
354
|
-
axes[int(axis)].edev = float(value)
|
|
355
|
-
elif par_name == "edir":
|
|
356
|
-
axes[int(axis)].edir = int(value)
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
def get_status(axis: str):
|
|
360
|
-
return f"{axis}:0::0:{axes[int(axis)].get_encoder_position()}:0:0:0:1:0:0:0:0:0:0:0:0\r\n"
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
def get_state(axis: str):
|
|
364
|
-
return f"{axis}:{axes[int(axis)].get_state()};"
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
def set_slew_speed(axis: str, slew_speed: str):
|
|
368
|
-
axes[int(axis)].set_slew_speed(int(slew_speed))
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
def get_current_position(axis: str) -> str:
|
|
372
|
-
return f"{axis}:{axes[int(axis)].get_current_position()};"
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
def get_current_encoder_position(axis: str) -> str:
|
|
376
|
-
# For now, we just return the current position, but this should actually
|
|
377
|
-
# lag a little behind the current position. That's why it is to_be_implemented.
|
|
378
|
-
return f"{axis}:{axes[int(axis)].get_encoder_position()};"
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
def get_current_encoder_counter_value(axis: str) -> str:
|
|
382
|
-
return f"{axis}:{axes[int(axis)].get_encoder_counter_value()};"
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
def goto_position(axis, position):
|
|
386
|
-
|
|
387
|
-
axis = int(axis)
|
|
388
|
-
position = float(position)
|
|
389
|
-
|
|
390
|
-
# For the big rotation stage use the workaround to avoid continuous movement in the same
|
|
391
|
-
# direction, and to avoid the limit switch.
|
|
392
|
-
|
|
393
|
-
axes[axis].set_commanded_position(position)
|
|
394
|
-
axes[axis].start()
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
def move_to_position(axis, distance):
|
|
398
|
-
|
|
399
|
-
axis = int(axis)
|
|
400
|
-
distance = float(distance)
|
|
401
|
-
|
|
402
|
-
cp = axes[axis].get_current_position()
|
|
403
|
-
axes[axis].set_commanded_position(cp + distance)
|
|
404
|
-
axes[axis].start()
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
def home_position(axis, direction, pos):
|
|
408
|
-
LOGGER.debug(f"home{axis}:he;{direction}{pos}")
|
|
409
|
-
LOGGER.warning("The home_position() command is not yet implemented.")
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
def save_configuration():
|
|
413
|
-
print("Request to save the current configuration, not implemented.")
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
def reset():
|
|
417
|
-
print("Request to reset the device, not implemented.")
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
def nothing():
|
|
421
|
-
return None
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
class Pass:
|
|
425
|
-
"""
|
|
426
|
-
Used to indicate that the arguments from the pattern match should be passed on to the
|
|
427
|
-
response function.
|
|
428
|
-
"""
|
|
429
|
-
def __bool__(self):
|
|
430
|
-
return False
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
pass_args = Pass()
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
COMMAND_ACTIONS_RESPONSES = {
|
|
437
|
-
"?v": (None, "smc 1.2.1093"),
|
|
438
|
-
"?": (None, textwrap.dedent("""\
|
|
439
|
-
system date: June 20, 2022 08:44:22
|
|
440
|
-
os image: wes7
|
|
441
|
-
control IC: MCX
|
|
442
|
-
FBWF/UWF: disabled
|
|
443
|
-
available axes: 3
|
|
444
|
-
counter: not installed.
|
|
445
|
-
filter device: not available.
|
|
446
|
-
half screen device: not available.
|
|
447
|
-
simulator: true.
|
|
448
|
-
|
|
449
|
-
?:cmdlist returns a command list,
|
|
450
|
-
?:xyz returns help for command 'xyz'.
|
|
451
|
-
?<parameter>{:<axis>} returns current setting.
|
|
452
|
-
""")),
|
|
453
|
-
"update": (save_configuration, nothing),
|
|
454
|
-
"reset": (reset, nothing),
|
|
455
|
-
"quit": (cancel_movement, nothing)
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
COMMAND_PATTERNS_ACTIONS_RESPONSES = {
|
|
459
|
-
r"cerr(\d)": (clear_error, nothing),
|
|
460
|
-
r"ffast(\d)\:(\d+)": (set_slew_speed, nothing),
|
|
461
|
-
r"(edev)(\d):(\d+(?:\.\d+)?)": (set_parameter, nothing),
|
|
462
|
-
r"(edir)(\d):(\d)": (set_parameter, nothing),
|
|
463
|
-
r"goto(\d):(-?\d+(?:\.\d+)?)": (goto_position, nothing),
|
|
464
|
-
r"move(\d):(-?\d+(?:\.\d+)?)": (move_to_position, nothing),
|
|
465
|
-
r"home(\d):he;(h[mr])(-?\d+(?:\.\d+)?)": (home_position, nothing),
|
|
466
|
-
r"\?err(\d)": (pass_args, get_error),
|
|
467
|
-
r"\?p(\d)": (pass_args, get_current_position),
|
|
468
|
-
r"\?e(\d)": (pass_args, get_current_encoder_position),
|
|
469
|
-
r"\?ec(\d)": (pass_args, get_current_encoder_counter_value),
|
|
470
|
-
r"\?s(\d)": (pass_args, get_state),
|
|
471
|
-
r"\?status(\d)": (pass_args, get_status),
|
|
472
|
-
r"\?conf(\d)": (pass_args, get_configuration),
|
|
473
|
-
r"\?(\w+)(\d)": (pass_args, get_parameter),
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
def process_command(command_string: str) -> str:
|
|
478
|
-
|
|
479
|
-
LOGGER.debug(f"{command_string = }")
|
|
480
|
-
|
|
481
|
-
try:
|
|
482
|
-
action, response = COMMAND_ACTIONS_RESPONSES[command_string]
|
|
483
|
-
action and action()
|
|
484
|
-
if error_msg:
|
|
485
|
-
return error_msg
|
|
486
|
-
else:
|
|
487
|
-
return response if isinstance(response, str) else response()
|
|
488
|
-
except KeyError:
|
|
489
|
-
# try to match with a value
|
|
490
|
-
for key, value in COMMAND_PATTERNS_ACTIONS_RESPONSES.items():
|
|
491
|
-
if match := re.match(key, command_string):
|
|
492
|
-
LOGGER.debug(f"{match=}, {match.groups()}")
|
|
493
|
-
action, response = value
|
|
494
|
-
LOGGER.debug(f"{action=}, {response=}")
|
|
495
|
-
# if action is not None and not isinstance(action, Pass):
|
|
496
|
-
action and action(*match.groups())
|
|
497
|
-
if error_msg:
|
|
498
|
-
return error_msg
|
|
499
|
-
if isinstance(response, str):
|
|
500
|
-
return response
|
|
501
|
-
elif isinstance(action, Pass):
|
|
502
|
-
return response(*match.groups())
|
|
503
|
-
else:
|
|
504
|
-
return response()
|
|
505
|
-
return f"ERROR: unknown command string: {command_string}"
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
@click.group()
|
|
509
|
-
def cli():
|
|
510
|
-
pass
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
@cli.command()
|
|
514
|
-
def start(): # sourcery skip: hoist-statement-from-loop
|
|
515
|
-
global error_msg
|
|
516
|
-
|
|
517
|
-
LOGGER.info("Starting the SMC9300 Simulator")
|
|
518
|
-
|
|
519
|
-
quit_request = False
|
|
520
|
-
|
|
521
|
-
while not quit_request:
|
|
522
|
-
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
523
|
-
s.bind((HOST, STAGES_SETTINGS.PORT))
|
|
524
|
-
s.listen()
|
|
525
|
-
conn, addr = s.accept()
|
|
526
|
-
with conn:
|
|
527
|
-
LOGGER.info(f"Accepted connection from {addr}")
|
|
528
|
-
write(conn, 'smc 1.2.1093')
|
|
529
|
-
try:
|
|
530
|
-
while True:
|
|
531
|
-
error_msg = ""
|
|
532
|
-
data = read(conn)
|
|
533
|
-
if (response := process_command(data)) is not None:
|
|
534
|
-
write(conn, response)
|
|
535
|
-
LOGGER.debug(f"{data = } -> {response = }")
|
|
536
|
-
if not data:
|
|
537
|
-
break # connection closed by peer
|
|
538
|
-
except KeyboardInterrupt:
|
|
539
|
-
LOGGER.info("Keyboard interrupt, closing.")
|
|
540
|
-
except ConnectionResetError as exc:
|
|
541
|
-
LOGGER.info(f"ConnectionResetError: {exc}")
|
|
542
|
-
except Exception as exc:
|
|
543
|
-
LOGGER.info(f"{exc.__class__.__name__} caught: {exc.args}")
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
if __name__ == "__main__":
|
|
547
|
-
cli()
|