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/hexapod/symetrie/zonda.py
DELETED
|
@@ -1,872 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module defines the device classes to be used to connect to and control the Hexapod ZONDA from
|
|
3
|
-
Symétrie.
|
|
4
|
-
|
|
5
|
-
"""
|
|
6
|
-
import logging
|
|
7
|
-
import math
|
|
8
|
-
import time
|
|
9
|
-
from typing import Dict
|
|
10
|
-
|
|
11
|
-
from egse.device import DeviceInterface
|
|
12
|
-
from egse.hexapod import HexapodError
|
|
13
|
-
from egse.hexapod.symetrie.alpha import AlphaPlusControllerInterface
|
|
14
|
-
from egse.hexapod.symetrie.zonda_devif import RETURN_CODES
|
|
15
|
-
from egse.hexapod.symetrie.zonda_devif import ZondaError
|
|
16
|
-
from egse.hexapod.symetrie.zonda_devif import ZondaTelnetInterface
|
|
17
|
-
from egse.hexapod.symetrie.zonda_devif import decode_command
|
|
18
|
-
from egse.proxy import Proxy
|
|
19
|
-
from egse.settings import Settings
|
|
20
|
-
from egse.system import Timer
|
|
21
|
-
from egse.system import wait_until
|
|
22
|
-
from egse.zmq_ser import connect_address
|
|
23
|
-
from numpy import loadtxt
|
|
24
|
-
from time import sleep
|
|
25
|
-
|
|
26
|
-
logger = logging.getLogger(__name__)
|
|
27
|
-
|
|
28
|
-
ZONDA_SETTINGS = Settings.load("ZONDA Controller")
|
|
29
|
-
CTRL_SETTINGS = Settings.load("Hexapod ZONDA Control Server")
|
|
30
|
-
DEVICE_SETTINGS = Settings.load(filename="zonda.yaml")
|
|
31
|
-
|
|
32
|
-
HOME_COMPLETE = 6
|
|
33
|
-
IN_POSITION = 3
|
|
34
|
-
IN_MOTION = 4
|
|
35
|
-
|
|
36
|
-
GENERAL_STATE = [
|
|
37
|
-
"Error",
|
|
38
|
-
"System initialized",
|
|
39
|
-
"Control on",
|
|
40
|
-
"In position",
|
|
41
|
-
"Motion task running",
|
|
42
|
-
"Home task running",
|
|
43
|
-
"Home complete",
|
|
44
|
-
"Home virtual",
|
|
45
|
-
"Phase found",
|
|
46
|
-
"Brake on",
|
|
47
|
-
"Motion restricted",
|
|
48
|
-
"Power on encoders",
|
|
49
|
-
"Power on limit switches",
|
|
50
|
-
"Power on drives",
|
|
51
|
-
"Emergency stop",
|
|
52
|
-
]
|
|
53
|
-
|
|
54
|
-
ACTUATOR_STATE = [
|
|
55
|
-
"Error",
|
|
56
|
-
"Control on",
|
|
57
|
-
"In position",
|
|
58
|
-
"Motion task running",
|
|
59
|
-
"Home task running",
|
|
60
|
-
"Home complete",
|
|
61
|
-
"Phase found",
|
|
62
|
-
"Brake on",
|
|
63
|
-
"Home hardware input",
|
|
64
|
-
"Negative hardware limit switch",
|
|
65
|
-
"Positive hardware limit switch",
|
|
66
|
-
"Software limit reached",
|
|
67
|
-
"Following error",
|
|
68
|
-
"Drive fault",
|
|
69
|
-
"Encoder error",
|
|
70
|
-
]
|
|
71
|
-
|
|
72
|
-
VALIDATION_LIMITS = [
|
|
73
|
-
"Factory workspace limits",
|
|
74
|
-
"Machine workspace limits",
|
|
75
|
-
"User workspace limits",
|
|
76
|
-
"Actuator limits",
|
|
77
|
-
"Joints limits",
|
|
78
|
-
"Due to backlash compensation",
|
|
79
|
-
]
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
class ZondaInterface(AlphaPlusControllerInterface, DeviceInterface):
|
|
83
|
-
"""
|
|
84
|
-
Interface definition for the ZondaController, the ZondaProxy and the ZondaSimulator.
|
|
85
|
-
"""
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
class ZondaController(ZondaInterface):
|
|
89
|
-
def __init__(self):
|
|
90
|
-
|
|
91
|
-
super().__init__()
|
|
92
|
-
|
|
93
|
-
logger.info(f"Initializing ZondaController with hostname={ZONDA_SETTINGS.IP} on port={ZONDA_SETTINGS.PORT}")
|
|
94
|
-
|
|
95
|
-
self.v_pos = None
|
|
96
|
-
|
|
97
|
-
self.cm = ["absolute", "object relative", "user relative"]
|
|
98
|
-
|
|
99
|
-
self.speed = {"vt": 0,
|
|
100
|
-
"vr": 0,
|
|
101
|
-
"vtmin": 0,
|
|
102
|
-
"vrmin": 0,
|
|
103
|
-
"vtmax": 0,
|
|
104
|
-
"vrmax": 0}
|
|
105
|
-
|
|
106
|
-
try:
|
|
107
|
-
self.hexapod = ZondaTelnetInterface()
|
|
108
|
-
|
|
109
|
-
except ZondaError as exc:
|
|
110
|
-
logger.warning(
|
|
111
|
-
f"HexapodError: Couldn't establish connection with the Hexapod ZONDA Hardware "
|
|
112
|
-
f"Controller: ({exc})"
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
def is_simulator(self):
|
|
116
|
-
return False
|
|
117
|
-
|
|
118
|
-
def is_connected(self):
|
|
119
|
-
return self.hexapod.is_connected()
|
|
120
|
-
|
|
121
|
-
def connect(self):
|
|
122
|
-
try:
|
|
123
|
-
self.hexapod.connect(ZONDA_SETTINGS.IP)
|
|
124
|
-
except ZondaError as exc:
|
|
125
|
-
logger.warning(f"ZondaError caught: Couldn't establish connection ({exc})")
|
|
126
|
-
raise HexapodError("Couldn't establish a connection with the Hexapod.") from exc
|
|
127
|
-
|
|
128
|
-
def disconnect(self):
|
|
129
|
-
try:
|
|
130
|
-
self.hexapod.disconnect()
|
|
131
|
-
except ZondaError as exc:
|
|
132
|
-
raise HexapodError("Couldn't disconnect from Hexapod.") from exc
|
|
133
|
-
|
|
134
|
-
def reconnect(self):
|
|
135
|
-
if self.is_connected():
|
|
136
|
-
self.disconnect()
|
|
137
|
-
self.connect()
|
|
138
|
-
|
|
139
|
-
def info(self):
|
|
140
|
-
try:
|
|
141
|
-
_version = self.hexapod.trans("VERS")
|
|
142
|
-
msg = "Info about the Hexapod ZONDA:\n"
|
|
143
|
-
msg += f"version = {_version}\n"
|
|
144
|
-
except ZondaError as exc:
|
|
145
|
-
raise HexapodError(
|
|
146
|
-
"Couldn't retrieve information from Hexapod ZONDA Hardware Controller."
|
|
147
|
-
) from exc
|
|
148
|
-
|
|
149
|
-
return msg
|
|
150
|
-
|
|
151
|
-
def get_general_state(self):
|
|
152
|
-
"""
|
|
153
|
-
Asks the general state of the hexapod on all the motors following the bits definition
|
|
154
|
-
presented below.
|
|
155
|
-
|
|
156
|
-
GENERAL_STATE =
|
|
157
|
-
0: "Error",
|
|
158
|
-
1: "System initialized",
|
|
159
|
-
2: "Control on",
|
|
160
|
-
3: "In position",
|
|
161
|
-
4: "Motion task running",
|
|
162
|
-
5: "Home task running",
|
|
163
|
-
6: "Home complete",
|
|
164
|
-
7: "Home virtual",
|
|
165
|
-
8: "Phase found",
|
|
166
|
-
9: "Brake on",
|
|
167
|
-
10:"Motion restricted",
|
|
168
|
-
11:"Power on encoders",
|
|
169
|
-
12:"Power on limit switches",
|
|
170
|
-
13:"Power on drives",
|
|
171
|
-
14:"Emergency stop"
|
|
172
|
-
|
|
173
|
-
Returns:
|
|
174
|
-
A dictionary with the bits value of each parameter.
|
|
175
|
-
"""
|
|
176
|
-
try:
|
|
177
|
-
rc = self.hexapod.trans("s_hexa")
|
|
178
|
-
rc = int(rc[0])
|
|
179
|
-
|
|
180
|
-
# from int to bit list of 15 elements corresponding to the hexapod state bits
|
|
181
|
-
# the bit list must be reversed to get lsb
|
|
182
|
-
|
|
183
|
-
s_hexa = [int(x) for x in f'{rc:015b}'[::-1]]
|
|
184
|
-
state = {k: v for k, v in zip(GENERAL_STATE, s_hexa)}
|
|
185
|
-
except ZondaError as exc:
|
|
186
|
-
raise HexapodError("Couldn't retrieve the state from Hexapod.") from exc
|
|
187
|
-
|
|
188
|
-
return [state, list(state.values())]
|
|
189
|
-
|
|
190
|
-
def stop(self):
|
|
191
|
-
try:
|
|
192
|
-
self.hexapod.trans("c_cmd=C_STOP")
|
|
193
|
-
sc = self.hexapod.check_command_status()
|
|
194
|
-
logger.warning(f"Stop command has been executed: {sc}")
|
|
195
|
-
except ZondaError as exc:
|
|
196
|
-
raise HexapodError("Couldn't disconnect from Hexapod.") from exc
|
|
197
|
-
return sc
|
|
198
|
-
|
|
199
|
-
def clear_error(self):
|
|
200
|
-
try:
|
|
201
|
-
print("Cleaning errors from buffer")
|
|
202
|
-
sc = self.hexapod.trans("c_cmd=C_CLEARERROR")
|
|
203
|
-
number = self.hexapod.trans('s_err_nr')
|
|
204
|
-
number = int(number[0])
|
|
205
|
-
|
|
206
|
-
if number == 0:
|
|
207
|
-
logger.info("All the errors have been cleared.")
|
|
208
|
-
else:
|
|
209
|
-
logger.warning("Couldn't clear all errors from Hexapod.")
|
|
210
|
-
|
|
211
|
-
except ZondaError as exc:
|
|
212
|
-
raise HexapodError("Couldn't clear all the errors from Hexapod.") from exc
|
|
213
|
-
return sc
|
|
214
|
-
|
|
215
|
-
def reset(self, wait=True):
|
|
216
|
-
try:
|
|
217
|
-
print("Resetting the Hexapod Controller")
|
|
218
|
-
print("STOP and CONTROLOFF commands are sent to the controller before reseting...")
|
|
219
|
-
self.stop()
|
|
220
|
-
print("Hexapod is stopped")
|
|
221
|
-
self.deactivate_control_loop()
|
|
222
|
-
print("Hexapod control loop has been deactivated")
|
|
223
|
-
|
|
224
|
-
print("Rebooting the controller: will take 2 min to initialize")
|
|
225
|
-
|
|
226
|
-
# FIXME: you might want to rethink this, because the reboot will close the Ethernet
|
|
227
|
-
# connection and therefore we need to reconnect after a two minutes waiting time.
|
|
228
|
-
# During the waiting time, the GUI should have all functions disabled and the
|
|
229
|
-
# connection icon should show a disconnected icon. Don't use `time.sleep()` as
|
|
230
|
-
# that will block the GUI, run a timer in a QThread signaling a reconnect when
|
|
231
|
-
# the sleep time is over.
|
|
232
|
-
self.hexapod.trans("system reboot")
|
|
233
|
-
|
|
234
|
-
except ZondaError as exc:
|
|
235
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
236
|
-
return None
|
|
237
|
-
|
|
238
|
-
def jog(self, axis: int, inc: float):
|
|
239
|
-
try:
|
|
240
|
-
self.hexapod.trans("c_ax={} c_par(0)={} c_cmd=C_JOG")
|
|
241
|
-
sc = self.hexapod.check_command_status()
|
|
242
|
-
|
|
243
|
-
except ZondaError as exc:
|
|
244
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
245
|
-
return sc
|
|
246
|
-
|
|
247
|
-
def perform_maintenance(self, axis):
|
|
248
|
-
try:
|
|
249
|
-
if axis == 10:
|
|
250
|
-
self.hexapod.trans("c_par(0)=3 c_cmd=C_MAINTENANCE")
|
|
251
|
-
else:
|
|
252
|
-
self.hexapod.trans("c_par(0)=2 c_par(1)={} c_cmd=C_MAINTENANCE".format(str(axis)))
|
|
253
|
-
|
|
254
|
-
sc = self.hexapod.check_command_status()
|
|
255
|
-
except ZondaError as exc:
|
|
256
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
257
|
-
return sc
|
|
258
|
-
|
|
259
|
-
def set_default(self):
|
|
260
|
-
try:
|
|
261
|
-
print("Resetting the hexapod to the factory default parameters...:")
|
|
262
|
-
self.hexapod.trans("c_cfg=1 c_cmd=C_CFG_DEFAULT")
|
|
263
|
-
sc = self.hexapod.check_command_status()
|
|
264
|
-
|
|
265
|
-
except ZondaError as exc:
|
|
266
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
267
|
-
return sc
|
|
268
|
-
|
|
269
|
-
def homing(self):
|
|
270
|
-
try:
|
|
271
|
-
print("Executing homing command")
|
|
272
|
-
self.hexapod.trans("c_cmd=C_HOME")
|
|
273
|
-
sc = self.hexapod.check_command_status()
|
|
274
|
-
|
|
275
|
-
except ZondaError as exc:
|
|
276
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
277
|
-
return sc
|
|
278
|
-
|
|
279
|
-
def goto_specific_position(self, pos):
|
|
280
|
-
try:
|
|
281
|
-
sc = self.hexapod.trans("c_par(0)={} c_cmd=C_MOVE_SPECIFICPOS".format(str(pos)))
|
|
282
|
-
print(sc)
|
|
283
|
-
|
|
284
|
-
except ZondaError as exc:
|
|
285
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
286
|
-
|
|
287
|
-
return sc
|
|
288
|
-
|
|
289
|
-
def goto_zero_position(self):
|
|
290
|
-
try:
|
|
291
|
-
sc = self.hexapod.trans("c_par(0)=1 c_cmd=C_MOVE_SPECIFICPOS")
|
|
292
|
-
print(sc)
|
|
293
|
-
|
|
294
|
-
except ZondaError as exc:
|
|
295
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
296
|
-
|
|
297
|
-
return sc
|
|
298
|
-
|
|
299
|
-
def goto_retracted_position(self):
|
|
300
|
-
try:
|
|
301
|
-
sc = self.hexapod.trans("c_par(0)=2 c_cmd=C_MOVE_SPECIFICPOS")
|
|
302
|
-
print(sc)
|
|
303
|
-
|
|
304
|
-
except ZondaError as exc:
|
|
305
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
306
|
-
|
|
307
|
-
return sc
|
|
308
|
-
|
|
309
|
-
def is_homing_done(self):
|
|
310
|
-
try:
|
|
311
|
-
sc = self.get_general_state()
|
|
312
|
-
homing = sc[1][HOME_COMPLETE]
|
|
313
|
-
|
|
314
|
-
except ZondaError as exc:
|
|
315
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
316
|
-
return homing
|
|
317
|
-
|
|
318
|
-
def is_in_position(self):
|
|
319
|
-
try:
|
|
320
|
-
sc = self.get_general_state()
|
|
321
|
-
in_position = sc[1][IN_POSITION]
|
|
322
|
-
|
|
323
|
-
except ZondaError as exc:
|
|
324
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
325
|
-
return in_position
|
|
326
|
-
|
|
327
|
-
def activate_control_loop(self):
|
|
328
|
-
try:
|
|
329
|
-
self.hexapod.trans("c_cmd=C_CONTROLON")
|
|
330
|
-
print("Executing activate_control_loop command")
|
|
331
|
-
sc = self.hexapod.check_command_status()
|
|
332
|
-
except ZondaError as exc:
|
|
333
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
334
|
-
return sc
|
|
335
|
-
|
|
336
|
-
def deactivate_control_loop(self):
|
|
337
|
-
try:
|
|
338
|
-
self.hexapod.trans("c_cmd=C_CONTROLOFF")
|
|
339
|
-
print("Executing deactivate_control_loop")
|
|
340
|
-
sc = self.hexapod.check_command_status()
|
|
341
|
-
except ZondaError as exc:
|
|
342
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
343
|
-
return sc
|
|
344
|
-
|
|
345
|
-
def machine_limit_enable(self, state: int):
|
|
346
|
-
try:
|
|
347
|
-
command = decode_command("CFG_LIMITENABLE", 1, state)
|
|
348
|
-
print(f"Executing machine_limit_enable command to state {state}. ")
|
|
349
|
-
self.hexapod.trans(command)
|
|
350
|
-
rc = self.hexapod.check_command_status()
|
|
351
|
-
except ZondaError as exc:
|
|
352
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
353
|
-
|
|
354
|
-
return rc
|
|
355
|
-
|
|
356
|
-
def machine_limit_set(
|
|
357
|
-
self, tx_n, ty_n, tz_n, rx_n, ry_n, rz_n, tx_p, ty_p, tz_p, rx_p, ry_p, rz_p):
|
|
358
|
-
try:
|
|
359
|
-
name = "CFG_LIMIT"
|
|
360
|
-
arguments = [1, tx_n, ty_n, tz_n, rx_n, ry_n, rz_n, tx_p, ty_p, tz_p, rx_p, ry_p, rz_p]
|
|
361
|
-
|
|
362
|
-
cmd = decode_command(name, *arguments)
|
|
363
|
-
|
|
364
|
-
print("Executing machine_limit_set command {}...: ".format(cmd), end="")
|
|
365
|
-
self.hexapod.trans(cmd)
|
|
366
|
-
self.hexapod.check_command_status()
|
|
367
|
-
|
|
368
|
-
except ZondaError as exc:
|
|
369
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
370
|
-
|
|
371
|
-
def user_limit_enable(self, state: int):
|
|
372
|
-
try:
|
|
373
|
-
command = decode_command("CFG_LIMITENABLE", 2, state)
|
|
374
|
-
print(f"Executing user_limit_enable command to state {state}...: ")
|
|
375
|
-
self.hexapod.trans(command)
|
|
376
|
-
self.hexapod.check_command_status()
|
|
377
|
-
except ZondaError as exc:
|
|
378
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
379
|
-
|
|
380
|
-
return None
|
|
381
|
-
|
|
382
|
-
def user_limit_set(
|
|
383
|
-
self, tx_n, ty_n, tz_n, rx_n, ry_n, rz_n, tx_p, ty_p, tz_p, rx_p, ry_p, rz_p):
|
|
384
|
-
try:
|
|
385
|
-
name = "CFG_LIMIT"
|
|
386
|
-
arguments = [2, tx_n, ty_n, tz_n, rx_n, ry_n, rz_n, tx_p, ty_p, tz_p, rx_p, ry_p, rz_p]
|
|
387
|
-
|
|
388
|
-
cmd = decode_command(name, *arguments)
|
|
389
|
-
|
|
390
|
-
print(f"Executing user_limit_set command {cmd}...: ")
|
|
391
|
-
self.hexapod.trans(cmd)
|
|
392
|
-
rc = self.hexapod.check_command_status()
|
|
393
|
-
|
|
394
|
-
except ZondaError as exc:
|
|
395
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
396
|
-
|
|
397
|
-
return rc
|
|
398
|
-
|
|
399
|
-
def __move(self, cm, tx, ty, tz, rx, ry, rz):
|
|
400
|
-
"""
|
|
401
|
-
Ask the controller to perform the movement defined by the arguments and the command MOVE_PTP.
|
|
402
|
-
|
|
403
|
-
For all control modes cm, the rotation centre coincides with the Object
|
|
404
|
-
Coordinates System origin and the movements are controlled with translation
|
|
405
|
-
components at first (Tx, Ty, tZ) and then the rotation components (Rx, Ry, Rz).
|
|
406
|
-
|
|
407
|
-
Control mode cm:
|
|
408
|
-
* 0 = absolute control, object coordinate system position and orientation
|
|
409
|
-
expressed in the invariant user coordinate system
|
|
410
|
-
* 1 = object relative, motion expressed in the Object Coordinate System
|
|
411
|
-
* 2 = user relative, motion expressed in the User Coordinate System
|
|
412
|
-
|
|
413
|
-
Args:
|
|
414
|
-
cm (int): control mode
|
|
415
|
-
tx (float): position on the X-axis [mm]
|
|
416
|
-
ty (float): position on the Y-axis [mm]
|
|
417
|
-
tz (float): position on the Z-axis [mm]
|
|
418
|
-
rx (float): rotation around the X-axis [deg]
|
|
419
|
-
ry (float): rotation around the Y-axis [deg]
|
|
420
|
-
rz (float): rotation around the Z-axis [deg]
|
|
421
|
-
"""
|
|
422
|
-
|
|
423
|
-
name = "MOVE_PTP"
|
|
424
|
-
arguments = [cm, tx, ty, tz, rx, ry, rz]
|
|
425
|
-
|
|
426
|
-
command = decode_command(name, *arguments)
|
|
427
|
-
print(f"Executing move_ptp command in {self.cm[cm]} mode ... {command}")
|
|
428
|
-
self.hexapod.trans(command)
|
|
429
|
-
return self.hexapod.check_command_status()
|
|
430
|
-
|
|
431
|
-
def validate_position(self, vm, cm, tx, ty, tz, rx, ry, rz):
|
|
432
|
-
# Currently only the vm=1 mode is developed by Symétrie
|
|
433
|
-
"""
|
|
434
|
-
Ask the controller if the movement defined by the arguments is feasible.
|
|
435
|
-
|
|
436
|
-
Returns a tuple where the first element is an integer that represents the
|
|
437
|
-
bitfield encoding the errors. The second element is a dictionary with the
|
|
438
|
-
bit numbers that were (on) and the corresponding error description as
|
|
439
|
-
defined by VALIDATION_LIMITS.
|
|
440
|
-
|
|
441
|
-
Args:
|
|
442
|
-
tx (float): position on the X-axis [mm]
|
|
443
|
-
ty (float): position on the Y-axis [mm]
|
|
444
|
-
tz (float): position on the Z-axis [mm]
|
|
445
|
-
rx (float): rotation around the X-axis [deg]
|
|
446
|
-
ry (float): rotation around the Y-axis [deg]
|
|
447
|
-
rz (float): rotation around the Z-axis [deg]
|
|
448
|
-
|
|
449
|
-
"""
|
|
450
|
-
name = "VALID_PTP"
|
|
451
|
-
arguments = [vm, cm, tx, ty, tz, rx, ry, rz]
|
|
452
|
-
|
|
453
|
-
command = decode_command(name, *arguments)
|
|
454
|
-
|
|
455
|
-
#print(f"Executing validate_position command: {command}")
|
|
456
|
-
|
|
457
|
-
self.hexapod.trans(command)
|
|
458
|
-
rc = self.hexapod.check_command_status()
|
|
459
|
-
pc = self.hexapod.get_pars(0)
|
|
460
|
-
pc = int(pc[0])
|
|
461
|
-
|
|
462
|
-
if pc == 0:
|
|
463
|
-
return 0, {}
|
|
464
|
-
|
|
465
|
-
if pc > 0:
|
|
466
|
-
d = decode_validation_error(pc)
|
|
467
|
-
return pc, d
|
|
468
|
-
|
|
469
|
-
# When coming here the command returned an error
|
|
470
|
-
|
|
471
|
-
msg = f"{RETURN_CODES.get(pc, 'unknown error code')}"
|
|
472
|
-
logger.error(f"Validate position: error code={pc} - {msg}")
|
|
473
|
-
|
|
474
|
-
return pc, {pc: msg}
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
def move_absolute(self, tx, ty, tz, rx, ry, rz):
|
|
478
|
-
try:
|
|
479
|
-
rc = self.__move(0, tx, ty, tz, rx, ry, rz)
|
|
480
|
-
|
|
481
|
-
except ZondaError as exc:
|
|
482
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
483
|
-
return rc
|
|
484
|
-
|
|
485
|
-
def move_relative_object(self, tx, ty, tz, rx, ry, rz):
|
|
486
|
-
try:
|
|
487
|
-
rc = self.__move(1, tx, ty, tz, rx, ry, rz)
|
|
488
|
-
|
|
489
|
-
except ZondaError as exc:
|
|
490
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
491
|
-
return rc
|
|
492
|
-
|
|
493
|
-
def move_relative_user(self, tx, ty, tz, rx, ry, rz):
|
|
494
|
-
try:
|
|
495
|
-
rc = self.__move(2, tx, ty, tz, rx, ry, rz)
|
|
496
|
-
|
|
497
|
-
except ZondaError as exc:
|
|
498
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
499
|
-
return rc
|
|
500
|
-
|
|
501
|
-
def check_absolute_movement(self, tx, ty, tz, rx, ry, rz):
|
|
502
|
-
# Currently only the vm=1 mode is developed by Symétrie
|
|
503
|
-
# Parameter cm = 0
|
|
504
|
-
return self.validate_position(1, 0, tx, ty, tz, rx, ry, rz)
|
|
505
|
-
|
|
506
|
-
def check_relative_object_movement(self, tx, ty, tz, rx, ry, rz):
|
|
507
|
-
# Currently only the vm=1 mode is developed by Symétrie
|
|
508
|
-
# Parameter cm = 1 for object
|
|
509
|
-
return self.validate_position(1, 1, tx, ty, tz, rx, ry, rz)
|
|
510
|
-
|
|
511
|
-
def check_relative_user_movement(self, tx, ty, tz, rx, ry, rz):
|
|
512
|
-
# Currently only the vm=1 mode is developed by Symétrie
|
|
513
|
-
# Parameter cm = 2 for user relative
|
|
514
|
-
return self.validate_position(1, 2, tx, ty, tz, rx, ry, rz)
|
|
515
|
-
|
|
516
|
-
def get_temperature(self):
|
|
517
|
-
#TODO: to be tested with the real Hexapod (the emulator does not implement this and only returns zeros)
|
|
518
|
-
try:
|
|
519
|
-
temp = self.hexapod.trans("s_ai_1,6,1")
|
|
520
|
-
temp = [float(x) for x in temp]
|
|
521
|
-
|
|
522
|
-
except ZondaError as exc:
|
|
523
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
524
|
-
return temp
|
|
525
|
-
|
|
526
|
-
def get_user_positions(self):
|
|
527
|
-
try:
|
|
528
|
-
uto = self.hexapod.trans("s_uto_tx,6,1")
|
|
529
|
-
uto = [float(x) for x in uto]
|
|
530
|
-
|
|
531
|
-
except ZondaError as exc:
|
|
532
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
533
|
-
return uto
|
|
534
|
-
|
|
535
|
-
def get_machine_positions(self):
|
|
536
|
-
try:
|
|
537
|
-
mtp = self.hexapod.trans("s_mtp_tx,6,1")
|
|
538
|
-
mtp = [float(x) for x in mtp]
|
|
539
|
-
|
|
540
|
-
except ZondaError as exc:
|
|
541
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
542
|
-
return mtp
|
|
543
|
-
|
|
544
|
-
def get_actuator_length(self):
|
|
545
|
-
try:
|
|
546
|
-
pos = self.hexapod.trans("s_pos_ax_1,6,1")
|
|
547
|
-
pos = [float(x) for x in pos]
|
|
548
|
-
|
|
549
|
-
except ZondaError as exc:
|
|
550
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
551
|
-
return pos
|
|
552
|
-
|
|
553
|
-
def get_actuator_state(self):
|
|
554
|
-
|
|
555
|
-
response = []
|
|
556
|
-
try:
|
|
557
|
-
actuator_states = self.hexapod.trans("s_ax_1,6,1")
|
|
558
|
-
actuator_states = [int(x) for x in actuator_states]
|
|
559
|
-
|
|
560
|
-
for idx, state in enumerate(actuator_states):
|
|
561
|
-
state_bits = [int(x) for x in f'{state:015b}'[::-1]]
|
|
562
|
-
state_dict = {k: v for k, v in zip(ACTUATOR_STATE, state_bits)}
|
|
563
|
-
response.append([state_dict, state_bits])
|
|
564
|
-
|
|
565
|
-
except ZondaError as exc:
|
|
566
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
567
|
-
|
|
568
|
-
return response
|
|
569
|
-
|
|
570
|
-
def get_coordinates_systems(self):
|
|
571
|
-
try:
|
|
572
|
-
command = decode_command("CFG_CS?")
|
|
573
|
-
print(f"Executing get_coordinate_system command: {command}")
|
|
574
|
-
self.hexapod.trans(command)
|
|
575
|
-
sc = self.hexapod.check_command_status()
|
|
576
|
-
cs = self.hexapod.get_pars(12)
|
|
577
|
-
cs = [float(x) for x in cs]
|
|
578
|
-
|
|
579
|
-
except ZondaError as exc:
|
|
580
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
581
|
-
return cs
|
|
582
|
-
|
|
583
|
-
def configure_coordinates_systems(
|
|
584
|
-
self, tx_u, ty_u, tz_u, rx_u, ry_u, rz_u, tx_o, ty_o, tz_o, rx_o, ry_o, rz_o
|
|
585
|
-
):
|
|
586
|
-
try:
|
|
587
|
-
name = "CFG_CS"
|
|
588
|
-
arguments = [tx_u, ty_u, tz_u, rx_u, ry_u, rz_u, tx_o, ty_o, tz_o, rx_o, ry_o, rz_o]
|
|
589
|
-
command = decode_command(name, *arguments)
|
|
590
|
-
print(f"Executing configure_coordinates_systems: {command}")
|
|
591
|
-
self.hexapod.trans(command)
|
|
592
|
-
rc = self.hexapod.check_command_status()
|
|
593
|
-
|
|
594
|
-
except ZondaError as exc:
|
|
595
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
596
|
-
return rc
|
|
597
|
-
|
|
598
|
-
def get_limits_value(self, lim):
|
|
599
|
-
# Not implemented in Puna
|
|
600
|
-
# lim: int | 0 = Factory, 1 = machine cs limits, 2 = user cs limits
|
|
601
|
-
try:
|
|
602
|
-
cmd = decode_command("CFG_LIMIT?", lim)
|
|
603
|
-
print(f"Executing get_limits_value command: {cmd=}")
|
|
604
|
-
self.hexapod.trans(cmd)
|
|
605
|
-
self.hexapod.check_command_status()
|
|
606
|
-
|
|
607
|
-
pc = self.hexapod.get_pars(13)
|
|
608
|
-
pc = [float(x) for x in pc[1:]]
|
|
609
|
-
|
|
610
|
-
except ZondaError as exc:
|
|
611
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
612
|
-
return pc
|
|
613
|
-
|
|
614
|
-
def get_limits_state(self):
|
|
615
|
-
# not implemented in Puna
|
|
616
|
-
try:
|
|
617
|
-
command = decode_command("CFG_LIMITENABLE?")
|
|
618
|
-
print(f"Executing get_limits_state command: {command=}")
|
|
619
|
-
self.hexapod.trans(command)
|
|
620
|
-
sc = self.hexapod.check_command_status()
|
|
621
|
-
|
|
622
|
-
if sc[0] == 0:
|
|
623
|
-
pc = self.hexapod.get_pars(3)
|
|
624
|
-
pc = [int(i) for i in pc]
|
|
625
|
-
else:
|
|
626
|
-
pc = ["nan", "nan", "nan"]
|
|
627
|
-
|
|
628
|
-
keys = VALIDATION_LIMITS[:3]
|
|
629
|
-
ls = {k: v for k, v in zip(keys, pc)}
|
|
630
|
-
|
|
631
|
-
except ZondaError as exc:
|
|
632
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
633
|
-
|
|
634
|
-
return ls
|
|
635
|
-
|
|
636
|
-
def get_speed(self):
|
|
637
|
-
try:
|
|
638
|
-
command = decode_command("CFG_SPEED?")
|
|
639
|
-
print(f"Executing get_speed command: {command}")
|
|
640
|
-
self.hexapod.trans(command)
|
|
641
|
-
sc = self.hexapod.check_command_status()
|
|
642
|
-
speed = self.hexapod.get_pars(6)
|
|
643
|
-
speed = [float(x) for x in speed]
|
|
644
|
-
keys = list(self.speed.keys())
|
|
645
|
-
|
|
646
|
-
s = {k: v for k, v in zip(keys, speed)}
|
|
647
|
-
|
|
648
|
-
except ZondaError as exc:
|
|
649
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
650
|
-
return s
|
|
651
|
-
|
|
652
|
-
def set_speed(self, vt, vr):
|
|
653
|
-
try:
|
|
654
|
-
name = "CFG_SPEED"
|
|
655
|
-
arguments = [vt, vr]
|
|
656
|
-
command = decode_command(name, *arguments)
|
|
657
|
-
# The parameters are automatically limited by the controller between the factory
|
|
658
|
-
# configured min/max speeds
|
|
659
|
-
self.hexapod.trans(command)
|
|
660
|
-
|
|
661
|
-
except ZondaError as exc:
|
|
662
|
-
raise HexapodError("Couldn't Execute command on Hexapod.") from exc
|
|
663
|
-
return
|
|
664
|
-
|
|
665
|
-
def sequence(self, file_path: str, time_sleep: float):
|
|
666
|
-
file = file_path + ".txt"
|
|
667
|
-
SEQUENCE = loadtxt(file)
|
|
668
|
-
for step in SEQUENCE:
|
|
669
|
-
state = self.check_absolute_movement(step[0], step[1], step[2], step[3], step[4], step[5])
|
|
670
|
-
if state[0] != 0:
|
|
671
|
-
print('Error: Out of bounds! One pont is out of the workspace!')
|
|
672
|
-
return
|
|
673
|
-
print("OK! The entire trajectory is reachable in the defined workspace.")
|
|
674
|
-
step_number = 0
|
|
675
|
-
for step in SEQUENCE:
|
|
676
|
-
step_number += 1
|
|
677
|
-
print("\nExecuting step number ", step_number, "over ", len(SEQUENCE), ": ", step)
|
|
678
|
-
self.move_absolute(step[0], step[1], step[2], step[3], step[4], step[5])
|
|
679
|
-
in_pos = self.get_general_state()[1][3]
|
|
680
|
-
while not(in_pos):
|
|
681
|
-
in_pos = self.get_general_state()[1][3]
|
|
682
|
-
print("Step ", step_number, "done.\nWaiting for ", time_sleep, "seconds.")
|
|
683
|
-
sleep(time_sleep)
|
|
684
|
-
print('Sequence "' + file_path + '" done with success!')
|
|
685
|
-
|
|
686
|
-
class ZondaSimulator(ZondaInterface):
|
|
687
|
-
"""
|
|
688
|
-
HexapodSimulator simulates the Symétrie Hexapod ZONDA. The class is heavily based on the
|
|
689
|
-
ReferenceFrames in the `egse.coordinates` package.
|
|
690
|
-
|
|
691
|
-
The simulator implements the same methods as the HexapodController class which acts on the
|
|
692
|
-
real hardware controller in either simulation mode or with a real Hexapod ZONDA connected.
|
|
693
|
-
|
|
694
|
-
Therefore, the HexapodSimulator can be used instead of the Hexapod class in test harnesses
|
|
695
|
-
and when the hardware is not available.
|
|
696
|
-
|
|
697
|
-
This class simulates all the movements and status of the Hexapod.
|
|
698
|
-
"""
|
|
699
|
-
def __init__(self):
|
|
700
|
-
# Keep a record if the homing() command has been executed.
|
|
701
|
-
|
|
702
|
-
self.homing_done = False
|
|
703
|
-
self.control_loop = False
|
|
704
|
-
self._virtual_homing = False
|
|
705
|
-
self._virtual_homing_position = None
|
|
706
|
-
|
|
707
|
-
def is_simulator(self):
|
|
708
|
-
return True
|
|
709
|
-
|
|
710
|
-
def connect(self):
|
|
711
|
-
pass
|
|
712
|
-
|
|
713
|
-
def reconnect(self):
|
|
714
|
-
pass
|
|
715
|
-
|
|
716
|
-
def disconnect(self):
|
|
717
|
-
# TODO:
|
|
718
|
-
# Should I keep state in this class to check if it has been disconnected?
|
|
719
|
-
#
|
|
720
|
-
# TODO:
|
|
721
|
-
# What happens when I re-connect to this Simulator? Shall it be in Homing position or
|
|
722
|
-
# do I have to keep state via a persistency mechanism?
|
|
723
|
-
pass
|
|
724
|
-
|
|
725
|
-
def is_connected(self):
|
|
726
|
-
return True
|
|
727
|
-
|
|
728
|
-
def clear_error(self):
|
|
729
|
-
return 0
|
|
730
|
-
|
|
731
|
-
def homing(self):
|
|
732
|
-
self.goto_zero_position()
|
|
733
|
-
self.homing_done = True
|
|
734
|
-
self._virtual_homing = False
|
|
735
|
-
self._virtual_homing_position = None
|
|
736
|
-
return 0
|
|
737
|
-
|
|
738
|
-
def is_homing_done(self):
|
|
739
|
-
return self.homing_done
|
|
740
|
-
|
|
741
|
-
def activate_control_loop(self):
|
|
742
|
-
self.control_loop = True
|
|
743
|
-
return self.control_loop
|
|
744
|
-
|
|
745
|
-
def deactivate_control_loop(self):
|
|
746
|
-
self.control_loop = False
|
|
747
|
-
return self.control_loop
|
|
748
|
-
|
|
749
|
-
pass
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
class ZondaProxy(Proxy, ZondaInterface):
|
|
753
|
-
"""The ZondaProxy class is used to connect to the control server and send commands to the
|
|
754
|
-
Hexapod ZONDA remotely."""
|
|
755
|
-
|
|
756
|
-
def __init__(
|
|
757
|
-
self,
|
|
758
|
-
protocol=CTRL_SETTINGS.PROTOCOL,
|
|
759
|
-
hostname=CTRL_SETTINGS.HOSTNAME,
|
|
760
|
-
port=CTRL_SETTINGS.COMMANDING_PORT,
|
|
761
|
-
):
|
|
762
|
-
"""
|
|
763
|
-
Args:
|
|
764
|
-
protocol: the transport protocol [default is taken from settings file]
|
|
765
|
-
hostname: location of the control server (IP address) [default is taken from settings
|
|
766
|
-
file]
|
|
767
|
-
port: TCP port on which the control server is listening for commands [default is
|
|
768
|
-
taken from settings file]
|
|
769
|
-
"""
|
|
770
|
-
super().__init__(connect_address(protocol, hostname, port))
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
def decode_validation_error(value) -> Dict:
|
|
774
|
-
"""
|
|
775
|
-
Decode the bitfield variable that is returned by the VALID_PTP command.
|
|
776
|
-
|
|
777
|
-
Each bit in this variable represents a particular error in the validation of a movement.
|
|
778
|
-
Several errors can be combined into the given variable.
|
|
779
|
-
|
|
780
|
-
Returns a dictionary with the bit numbers that were (on) and the corresponding error description.
|
|
781
|
-
"""
|
|
782
|
-
|
|
783
|
-
return {bit: VALIDATION_LIMITS[bit] for bit in range(6) if value >> bit & 0b01}
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
if __name__ == "__main__":
|
|
787
|
-
|
|
788
|
-
from rich import print as rp
|
|
789
|
-
|
|
790
|
-
zonda = ZondaController()
|
|
791
|
-
zonda.connect()
|
|
792
|
-
|
|
793
|
-
with Timer("ZondaController"):
|
|
794
|
-
|
|
795
|
-
rp(zonda.info())
|
|
796
|
-
rp(zonda.is_homing_done())
|
|
797
|
-
rp(zonda.is_in_position())
|
|
798
|
-
rp(zonda.activate_control_loop())
|
|
799
|
-
rp(zonda.get_general_state())
|
|
800
|
-
rp(zonda.get_actuator_state())
|
|
801
|
-
rp(zonda.deactivate_control_loop())
|
|
802
|
-
rp(zonda.get_general_state())
|
|
803
|
-
rp(zonda.get_actuator_state())
|
|
804
|
-
rp(zonda.stop())
|
|
805
|
-
rp(zonda.get_limits_value(0))
|
|
806
|
-
rp(zonda.get_limits_value(1))
|
|
807
|
-
rp(zonda.check_absolute_movement(1, 1, 1, 1, 1, 1))
|
|
808
|
-
rp(zonda.check_absolute_movement(51, 51, 51, 1, 1, 1))
|
|
809
|
-
rp(zonda.get_speed())
|
|
810
|
-
rp(zonda.set_speed(2.0, 1.0))
|
|
811
|
-
time.sleep(0.5) # if we do not sleep, the get_speed() will get the old values
|
|
812
|
-
speed = zonda.get_speed()
|
|
813
|
-
|
|
814
|
-
if not math.isclose(speed['vt'], 2.0):
|
|
815
|
-
rp(f"[red]{speed['vt']} != 2.0[/red]")
|
|
816
|
-
if not math.isclose(speed['vr'], 1.0):
|
|
817
|
-
rp(f"[red]{speed['vr']} != 1.0[/red]")
|
|
818
|
-
|
|
819
|
-
rp(zonda.get_actuator_length())
|
|
820
|
-
|
|
821
|
-
# rp(zonda.machine_limit_enable(0))
|
|
822
|
-
# rp(zonda.machine_limit_enable(1))
|
|
823
|
-
# rp(zonda.get_limits_state())
|
|
824
|
-
rp(zonda.get_coordinates_systems())
|
|
825
|
-
rp(zonda.configure_coordinates_systems(
|
|
826
|
-
0.033000, -0.238000, 230.205000, 0.003282, 0.005671, 0.013930,
|
|
827
|
-
0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000))
|
|
828
|
-
rp(zonda.get_coordinates_systems())
|
|
829
|
-
rp(zonda.get_machine_positions())
|
|
830
|
-
rp(zonda.get_user_positions())
|
|
831
|
-
rp(zonda.configure_coordinates_systems(
|
|
832
|
-
0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000,
|
|
833
|
-
0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000))
|
|
834
|
-
rp(zonda.validate_position(1, 0, 0, 0, 0, 0, 0, 0))
|
|
835
|
-
rp(zonda.validate_position(1, 0, 0, 0, 50, 0, 0, 0))
|
|
836
|
-
|
|
837
|
-
rp(zonda.goto_zero_position())
|
|
838
|
-
rp(zonda.is_in_position())
|
|
839
|
-
if wait_until(zonda.is_in_position, interval=1, timeout=300):
|
|
840
|
-
rp("[red]Task zonda.is_in_position() timed out after 30s.[/red]")
|
|
841
|
-
rp(zonda.is_in_position())
|
|
842
|
-
|
|
843
|
-
rp(zonda.get_machine_positions())
|
|
844
|
-
rp(zonda.get_user_positions())
|
|
845
|
-
|
|
846
|
-
rp(zonda.move_absolute(0, 0, 12, 0, 0, 10))
|
|
847
|
-
|
|
848
|
-
rp(zonda.is_in_position())
|
|
849
|
-
if wait_until(zonda.is_in_position, interval=1, timeout=300):
|
|
850
|
-
rp("[red]Task zonda.is_in_position() timed out after 30s.[/red]")
|
|
851
|
-
rp(zonda.is_in_position())
|
|
852
|
-
|
|
853
|
-
rp(zonda.get_machine_positions())
|
|
854
|
-
rp(zonda.get_user_positions())
|
|
855
|
-
|
|
856
|
-
rp(zonda.move_absolute(0, 0, 0, 0, 0, 0))
|
|
857
|
-
|
|
858
|
-
rp(zonda.is_in_position())
|
|
859
|
-
if wait_until(zonda.is_in_position, interval=1, timeout=300):
|
|
860
|
-
rp("[red]Task zonda.is_in_position() timed out after 30s.[/red]")
|
|
861
|
-
rp(zonda.is_in_position())
|
|
862
|
-
|
|
863
|
-
rp(zonda.get_machine_positions())
|
|
864
|
-
rp(zonda.get_user_positions())
|
|
865
|
-
|
|
866
|
-
# zonda.reset()
|
|
867
|
-
zonda.disconnect()
|
|
868
|
-
|
|
869
|
-
# rp(0, decode_validation_error(0))
|
|
870
|
-
# rp(11, decode_validation_error(11))
|
|
871
|
-
# rp(8, decode_validation_error(8))
|
|
872
|
-
# rp(24, decode_validation_error(24))
|