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/fov/fov_hk.py
DELETED
|
@@ -1,710 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
import multiprocessing
|
|
3
|
-
import pickle
|
|
4
|
-
import threading
|
|
5
|
-
|
|
6
|
-
import click
|
|
7
|
-
import invoke
|
|
8
|
-
import numpy as np
|
|
9
|
-
import rich
|
|
10
|
-
import sys
|
|
11
|
-
import zmq
|
|
12
|
-
from math import sin, cos, acos, atan, atan2, radians, degrees
|
|
13
|
-
from prometheus_client import start_http_server
|
|
14
|
-
|
|
15
|
-
from egse.control import is_control_server_active
|
|
16
|
-
from egse.fov import store_actual_fov_position
|
|
17
|
-
from egse.settings import Settings
|
|
18
|
-
from egse.setup import load_setup
|
|
19
|
-
from egse.storage import is_storage_manager_active
|
|
20
|
-
from egse.storage import register_to_storage_manager
|
|
21
|
-
from egse.storage.persistence import CSV
|
|
22
|
-
from egse.zmq_ser import connect_address, bind_address
|
|
23
|
-
|
|
24
|
-
CTRL_SETTINGS = Settings.load("FOV HK Control Server")
|
|
25
|
-
LOGGER = logging.getLogger(__name__)
|
|
26
|
-
SITE_ID = Settings.load("SITE").ID
|
|
27
|
-
ORIGIN = "FOV"
|
|
28
|
-
|
|
29
|
-
TIMEOUT_RECV = 1.0 # seconds
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
@click.group()
|
|
33
|
-
def cli():
|
|
34
|
-
pass
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
@cli.command()
|
|
38
|
-
def start():
|
|
39
|
-
""" Start the FOV HK Control Server.
|
|
40
|
-
|
|
41
|
-
This process will only store the actual FOV position (in field angles, expressed in degrees). The commanded
|
|
42
|
-
position needs to be stored from the MGSE commanding in plato-test-scripts.
|
|
43
|
-
|
|
44
|
-
Under the hood, this method calls the TH-specific implementation. Only this generic function should be used, not
|
|
45
|
-
the TH-specific implementation.
|
|
46
|
-
"""
|
|
47
|
-
|
|
48
|
-
multiprocessing.current_process().name = "fov_hk"
|
|
49
|
-
start_http_server(CTRL_SETTINGS.METRICS_PORT)
|
|
50
|
-
|
|
51
|
-
# The Storage Manager must be active (otherwise the HK cannot be stored)
|
|
52
|
-
|
|
53
|
-
if not is_storage_manager_active():
|
|
54
|
-
|
|
55
|
-
LOGGER.error("The Storage Manager is not running, start the core services before running the data acquisition.")
|
|
56
|
-
return
|
|
57
|
-
|
|
58
|
-
# Make sure the FOV position HK file contains the following columns:
|
|
59
|
-
# - timestamp
|
|
60
|
-
# - FOV_ACT_THETA: the actual gnomonic distance to the optical axis [degrees]
|
|
61
|
-
# - FOV_ACT_PHI: the actual in-field angle [degrees]
|
|
62
|
-
# - FOV_CMD_THETA: the commanded gnomonic distance to the optical axis [degrees]
|
|
63
|
-
# - FOV_CMD_PHI: the commanded in-field angle [degrees]
|
|
64
|
-
|
|
65
|
-
register_to_storage_manager(ORIGIN, CSV, prep=dict(mode='a', column_names=["timestamp", "FOV_ACT_THETA",
|
|
66
|
-
"FOV_ACT_PHI", "FOV_CMD_THETA",
|
|
67
|
-
"FOV_CMD_PHI"]))
|
|
68
|
-
|
|
69
|
-
# Make sure you notice when a command has been issued to stop the FOV HK generation
|
|
70
|
-
|
|
71
|
-
context = zmq.Context()
|
|
72
|
-
|
|
73
|
-
endpoint = bind_address(CTRL_SETTINGS.PROTOCOL, CTRL_SETTINGS.COMMANDING_PORT)
|
|
74
|
-
commander = context.socket(zmq.REP)
|
|
75
|
-
commander.bind(endpoint)
|
|
76
|
-
|
|
77
|
-
poller = zmq.Poller()
|
|
78
|
-
poller.register(commander, zmq.POLLIN)
|
|
79
|
-
|
|
80
|
-
# Start listening for HK updates
|
|
81
|
-
|
|
82
|
-
sitehash = {
|
|
83
|
-
"CSL": _csl_start,
|
|
84
|
-
"CSL1": _csl1_start,
|
|
85
|
-
"CSL2": _csl2_start,
|
|
86
|
-
"IAS": _ias_start,
|
|
87
|
-
"INTA": _inta_start,
|
|
88
|
-
"SRON": _sron_start,
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
sitehash[SITE_ID](commander, poller)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
@cli.command()
|
|
95
|
-
def start_bg():
|
|
96
|
-
""" Start the generation of FOV position HK as a background process.
|
|
97
|
-
|
|
98
|
-
This process will only store the actual FOV position (in field angles, expressed in degrees). The commanded
|
|
99
|
-
position needs to be stored from the MGSE commanding in plato-test-scripts.
|
|
100
|
-
|
|
101
|
-
Under the hood, this method calls the TH-specific implementation. Only this generic function should be used, not
|
|
102
|
-
the TH-specific implementation.
|
|
103
|
-
"""
|
|
104
|
-
|
|
105
|
-
invoke.run(f"fov_hk start", disown=True)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
class FovHk:
|
|
109
|
-
|
|
110
|
-
def __init__(self):
|
|
111
|
-
|
|
112
|
-
self.setup = load_setup()
|
|
113
|
-
self.keep_acquiring_fov_hk = True
|
|
114
|
-
|
|
115
|
-
def run(self, commander, poller):
|
|
116
|
-
|
|
117
|
-
try:
|
|
118
|
-
|
|
119
|
-
while True:
|
|
120
|
-
|
|
121
|
-
if _check_commander_status(commander, poller):
|
|
122
|
-
self.keep_acquiring_fov_hk = False
|
|
123
|
-
break
|
|
124
|
-
|
|
125
|
-
except KeyboardInterrupt:
|
|
126
|
-
|
|
127
|
-
click.echo("KeyboardInterrupt caught!")
|
|
128
|
-
self.keep_acquiring_fov_hk = False
|
|
129
|
-
|
|
130
|
-
# Keyboard interrupt or stop command
|
|
131
|
-
|
|
132
|
-
LOGGER.info("Shutting down FOV HK")
|
|
133
|
-
self.close_sockets()
|
|
134
|
-
commander.close(linger=0)
|
|
135
|
-
|
|
136
|
-
def start_fov_hk_acquisition(self):
|
|
137
|
-
|
|
138
|
-
# Processing the content of the queue should be done in a separate thread
|
|
139
|
-
|
|
140
|
-
self.process_fov_hk_thread = threading.Thread(target=self.acquire_fov_hk)
|
|
141
|
-
self.process_fov_hk_thread.daemon = True
|
|
142
|
-
self.process_fov_hk_thread.start()
|
|
143
|
-
|
|
144
|
-
def acquire_fov_hk(self):
|
|
145
|
-
pass
|
|
146
|
-
|
|
147
|
-
def close_sockets(self):
|
|
148
|
-
pass
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
class CslFovHk(FovHk):
|
|
152
|
-
|
|
153
|
-
def __init__(self):
|
|
154
|
-
|
|
155
|
-
super(CslFovHk, self).__init__()
|
|
156
|
-
|
|
157
|
-
setup = load_setup()
|
|
158
|
-
self.height_collimated_beam = setup.gse.stages.calibration.height_collimated_beam
|
|
159
|
-
self.offset_delta_x = setup.gse.stages.calibration.offset_delta_x
|
|
160
|
-
self.offset_phi = setup.gse.stages.calibration.offset_phi
|
|
161
|
-
|
|
162
|
-
# Create a socket and connect to the monitoring port
|
|
163
|
-
|
|
164
|
-
settings = Settings.load("Huber Control Server")
|
|
165
|
-
self.cmd_endpoint = connect_address(settings.PROTOCOL, settings.HOSTNAME, settings.COMMANDING_PORT)
|
|
166
|
-
|
|
167
|
-
monitoring_address = connect_address(settings.PROTOCOL, settings.HOSTNAME, settings.MONITORING_PORT)
|
|
168
|
-
self.monitoring_socket = zmq.Context().socket(zmq.SUB)
|
|
169
|
-
self.monitoring_socket.connect(monitoring_address)
|
|
170
|
-
self.monitoring_socket.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
171
|
-
self.monitoring_timeout = 1.0
|
|
172
|
-
|
|
173
|
-
self.start_fov_hk_acquisition()
|
|
174
|
-
|
|
175
|
-
def acquire_fov_hk(self):
|
|
176
|
-
|
|
177
|
-
while self.keep_acquiring_fov_hk:
|
|
178
|
-
|
|
179
|
-
try:
|
|
180
|
-
|
|
181
|
-
socket_list, _, _ = zmq.select([self.monitoring_socket], [], [], timeout=self.monitoring_timeout)
|
|
182
|
-
|
|
183
|
-
# Monitoring information was received (before timeout)
|
|
184
|
-
|
|
185
|
-
if self.monitoring_socket in socket_list:
|
|
186
|
-
|
|
187
|
-
pickle_string = self.monitoring_socket.recv()
|
|
188
|
-
monitoring_info = pickle.loads(pickle_string)
|
|
189
|
-
|
|
190
|
-
# Retrieve the position of the small and the big rotation stage
|
|
191
|
-
|
|
192
|
-
position_big_rotation_stage = monitoring_info["big_rotation_stage_position"]
|
|
193
|
-
position_translation_stage = monitoring_info["translation_stage_position"]
|
|
194
|
-
|
|
195
|
-
# Gnomonic distance to optical axis and in-field angle [degrees]
|
|
196
|
-
|
|
197
|
-
phi = self.offset_phi - position_big_rotation_stage
|
|
198
|
-
tan_theta = (self.offset_delta_x - position_translation_stage) / self.height_collimated_beam
|
|
199
|
-
theta = degrees(atan(tan_theta))
|
|
200
|
-
|
|
201
|
-
store_actual_fov_position(theta, phi)
|
|
202
|
-
|
|
203
|
-
elif is_control_server_active(self.cmd_endpoint):
|
|
204
|
-
self.monitoring_timeout += 0.5
|
|
205
|
-
|
|
206
|
-
except zmq.ZMQError:
|
|
207
|
-
pass
|
|
208
|
-
|
|
209
|
-
def close_sockets(self):
|
|
210
|
-
|
|
211
|
-
self.monitoring_socket.close()
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
def _csl_start(commander, poller):
|
|
215
|
-
""" Start the generation of FOV position HK for CSL.
|
|
216
|
-
|
|
217
|
-
This process will only store the actual FOV position (in field angles, expressed in degrees). The commanded
|
|
218
|
-
position needs to be stored from the MGSE commanding in plato-test-scripts.
|
|
219
|
-
|
|
220
|
-
This function should never be called. Instead, call the generic function start().
|
|
221
|
-
|
|
222
|
-
Args:
|
|
223
|
-
- commander: Commanding socket for the FOV HK generation.
|
|
224
|
-
- poller: Poller for the FOV HK generation.
|
|
225
|
-
"""
|
|
226
|
-
|
|
227
|
-
csl_fov_hk = CslFovHk()
|
|
228
|
-
csl_fov_hk.run(commander, poller)
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
class Csl1FovHk(FovHk):
|
|
232
|
-
|
|
233
|
-
def __init__(self):
|
|
234
|
-
|
|
235
|
-
super(Csl1FovHk, self).__init__()
|
|
236
|
-
|
|
237
|
-
setup = load_setup()
|
|
238
|
-
self.offset_alpha = setup.gse.stages.calibration.offset_alpha
|
|
239
|
-
self.alpha_correction_coefficients = setup.gse.stages.calibration.alpha_correction_coefficients
|
|
240
|
-
self.offset_phi = setup.gse.stages.calibration.offset_phi
|
|
241
|
-
self.phi_correction_coefficients = setup.gse.stages.calibration.phi_correction_coefficients
|
|
242
|
-
|
|
243
|
-
# Create a socket and connect to the monitoring port
|
|
244
|
-
|
|
245
|
-
settings = Settings.load("Huber Control Server")
|
|
246
|
-
self.cmd_endpoint = connect_address(settings.PROTOCOL, settings.HOSTNAME, settings.COMMANDING_PORT)
|
|
247
|
-
|
|
248
|
-
monitoring_address = connect_address(settings.PROTOCOL, settings.HOSTNAME, settings.MONITORING_PORT)
|
|
249
|
-
self.monitoring_socket = zmq.Context().socket(zmq.SUB)
|
|
250
|
-
self.monitoring_socket.connect(monitoring_address)
|
|
251
|
-
self.monitoring_socket.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
252
|
-
self.monitoring_timeout = 1.0
|
|
253
|
-
|
|
254
|
-
self.start_fov_hk_acquisition()
|
|
255
|
-
|
|
256
|
-
def acquire_fov_hk(self):
|
|
257
|
-
|
|
258
|
-
while self.keep_acquiring_fov_hk:
|
|
259
|
-
|
|
260
|
-
try:
|
|
261
|
-
|
|
262
|
-
socket_list, _, _ = zmq.select([self.monitoring_socket], [], [], timeout=self.monitoring_timeout)
|
|
263
|
-
|
|
264
|
-
# Monitoring information was received (before timeout)
|
|
265
|
-
|
|
266
|
-
if self.monitoring_socket in socket_list:
|
|
267
|
-
|
|
268
|
-
pickle_string = self.monitoring_socket.recv()
|
|
269
|
-
monitoring_info = pickle.loads(pickle_string)
|
|
270
|
-
|
|
271
|
-
# Retrieve the position of the small and the big rotation stage
|
|
272
|
-
|
|
273
|
-
position_big_rotation_stage = monitoring_info["big_rotation_stage_position"]
|
|
274
|
-
position_small_rotation_stage = monitoring_info["small_rotation_stage_position"]
|
|
275
|
-
|
|
276
|
-
# Gnomonic distance to optical axis and in-field angle [degrees]
|
|
277
|
-
|
|
278
|
-
theta = (position_small_rotation_stage + self.offset_alpha - self.alpha_correction_coefficients[0])\
|
|
279
|
-
/ self.alpha_correction_coefficients[1]
|
|
280
|
-
|
|
281
|
-
phi_correction = self.phi_correction_coefficients[1] * theta + self.phi_correction_coefficients[0]
|
|
282
|
-
phi = -position_big_rotation_stage - self.offset_phi - phi_correction
|
|
283
|
-
|
|
284
|
-
store_actual_fov_position(theta, phi)
|
|
285
|
-
|
|
286
|
-
elif is_control_server_active(self.cmd_endpoint):
|
|
287
|
-
self.monitoring_timeout += 0.5
|
|
288
|
-
|
|
289
|
-
except zmq.ZMQError:
|
|
290
|
-
pass
|
|
291
|
-
|
|
292
|
-
def close_sockets(self):
|
|
293
|
-
|
|
294
|
-
self.monitoring_socket.close()
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
def _csl1_start(commander, poller):
|
|
298
|
-
""" Start the generation of FOV position HK for CSL1.
|
|
299
|
-
|
|
300
|
-
This process will only store the actual FOV position (in field angles, expressed in degrees). The commanded
|
|
301
|
-
position needs to be stored from the MGSE commanding in plato-test-scripts.
|
|
302
|
-
|
|
303
|
-
This function should never be called. Instead, call the generic function start().
|
|
304
|
-
|
|
305
|
-
Args:
|
|
306
|
-
- commander: Commanding socket for the FOV HK generation.
|
|
307
|
-
- poller: Poller for the FOV HK generation.
|
|
308
|
-
"""
|
|
309
|
-
|
|
310
|
-
csl1_fov_hk = Csl1FovHk()
|
|
311
|
-
csl1_fov_hk.run(commander, poller)
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
def _csl2_start(commander, poller):
|
|
315
|
-
""" Start the generation of FOV position HK for CSL2.
|
|
316
|
-
|
|
317
|
-
This process will only store the actual FOV position (in field angles, expressed in degrees). The commanded
|
|
318
|
-
position needs to be stored from the MGSE commanding in plato-test-scripts.
|
|
319
|
-
|
|
320
|
-
This function should never be called. Instead, call the generic function start().
|
|
321
|
-
|
|
322
|
-
Args:
|
|
323
|
-
- commander: Commanding socket for the FOV HK generation.
|
|
324
|
-
- poller: Poller for the FOV HK generation.
|
|
325
|
-
"""
|
|
326
|
-
# At this point, the relation between the configuration of the Huber Stages and the source position is considered
|
|
327
|
-
# the same for CSL2 as for CSL1 (only the calibration of the Huber Stages is potentially different in the setup)
|
|
328
|
-
csl2_fov_hk = Csl1FovHk()
|
|
329
|
-
csl2_fov_hk.run(commander, poller)
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
class SronFovHk(FovHk):
|
|
333
|
-
|
|
334
|
-
def __init__(self):
|
|
335
|
-
|
|
336
|
-
super(SronFovHk, self).__init__()
|
|
337
|
-
|
|
338
|
-
# Create a socket and connect to the monitoring port
|
|
339
|
-
|
|
340
|
-
settings = Settings.load("Aerotech Ensemble Control Server")
|
|
341
|
-
self.cmd_endpoint = connect_address(settings.PROTOCOL, settings.HOSTNAME, settings.COMMANDING_PORT)
|
|
342
|
-
|
|
343
|
-
monitoring_address = connect_address(settings.PROTOCOL, settings.HOSTNAME, settings.MONITORING_PORT)
|
|
344
|
-
self.monitoring_socket = zmq.Context().socket(zmq.SUB)
|
|
345
|
-
self.monitoring_socket.connect(monitoring_address)
|
|
346
|
-
self.monitoring_socket.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
347
|
-
self.monitoring_timeout = 1.0
|
|
348
|
-
|
|
349
|
-
self.start_fov_hk_acquisition()
|
|
350
|
-
|
|
351
|
-
def acquire_fov_hk(self):
|
|
352
|
-
|
|
353
|
-
while self.keep_acquiring_fov_hk:
|
|
354
|
-
|
|
355
|
-
try:
|
|
356
|
-
|
|
357
|
-
socket_list, _, _ = zmq.select([self.monitoring_socket], [], [], timeout=self.monitoring_timeout)
|
|
358
|
-
|
|
359
|
-
# Monitoring information was received (before timeout)
|
|
360
|
-
|
|
361
|
-
if self.monitoring_socket in socket_list:
|
|
362
|
-
|
|
363
|
-
pickle_string = self.monitoring_socket.recv()
|
|
364
|
-
monitoring_info = pickle.loads(pickle_string)
|
|
365
|
-
|
|
366
|
-
# Update the timeout, to be more in line with the monitoring frequency of the CS (i.e. the delay).
|
|
367
|
-
# Take 0.5s extra to be on the safe side.
|
|
368
|
-
|
|
369
|
-
monitoring_timeout = monitoring_info["delay"] / 1000.0 + 0.5 # [s]
|
|
370
|
-
|
|
371
|
-
# Retrieve the position of the gimbal
|
|
372
|
-
|
|
373
|
-
rotx = radians(monitoring_info["alpha"]) # [radians]
|
|
374
|
-
roty = radians(monitoring_info["beta"]) # [radians]
|
|
375
|
-
|
|
376
|
-
if isinstance(roty, float):
|
|
377
|
-
rotx = np.array([rotx])
|
|
378
|
-
roty = np.array([roty])
|
|
379
|
-
|
|
380
|
-
tolerance = 1.e-5
|
|
381
|
-
|
|
382
|
-
# Corrections based on #598
|
|
383
|
-
# Copied from camtest.commanding.function.sron_functions.gimbal_rotations_to_fov_angles
|
|
384
|
-
theta = np.arccos(np.cos(rotx) * np.cos(roty))
|
|
385
|
-
|
|
386
|
-
phi = np.zeros_like(roty)
|
|
387
|
-
|
|
388
|
-
sel = np.where(np.abs(roty) < tolerance)
|
|
389
|
-
|
|
390
|
-
phi[sel] = np.sign(rotx[sel]) * np.pi/2.
|
|
391
|
-
|
|
392
|
-
sel = np.where(np.abs(roty) > tolerance)
|
|
393
|
-
|
|
394
|
-
phi[sel] = np.arctan2(-np.sin(-rotx[sel]) * np.cos(roty[sel]), np.sin(roty[sel]))
|
|
395
|
-
|
|
396
|
-
theta, phi = np.rad2deg(theta), np.rad2deg(phi)
|
|
397
|
-
|
|
398
|
-
store_actual_fov_position(theta[0], phi[0])
|
|
399
|
-
|
|
400
|
-
elif is_control_server_active(self.cmd_endpoint):
|
|
401
|
-
self.monitoring_timeout += 0.5
|
|
402
|
-
|
|
403
|
-
except zmq.ZMQError:
|
|
404
|
-
pass
|
|
405
|
-
|
|
406
|
-
def close_sockets(self):
|
|
407
|
-
|
|
408
|
-
self.monitoring_socket.close()
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
def _sron_start(commander, poller):
|
|
412
|
-
""" Start the generation of FOV position HK for SRON.
|
|
413
|
-
|
|
414
|
-
This process will only store the actual FOV position (in field angles, expressed in degrees). The commanded
|
|
415
|
-
position needs to be stored from the MGSE commanding in plato-test-scripts.
|
|
416
|
-
|
|
417
|
-
This function should never be called. Instead, call the generic function start().
|
|
418
|
-
|
|
419
|
-
Args:
|
|
420
|
-
- commander: Commanding socket for the FOV HK generation.
|
|
421
|
-
- poller: Poller for the FOV HK generation.
|
|
422
|
-
"""
|
|
423
|
-
|
|
424
|
-
sron_fov_hk = SronFovHk()
|
|
425
|
-
sron_fov_hk.run(commander, poller)
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
class IasFovHk(FovHk):
|
|
429
|
-
|
|
430
|
-
def __init__(self):
|
|
431
|
-
|
|
432
|
-
super(IasFovHk, self).__init__()
|
|
433
|
-
|
|
434
|
-
# Create a socket and connect to the monitoring port
|
|
435
|
-
|
|
436
|
-
settings = Settings.load("Hexapod ZONDA Control Server")
|
|
437
|
-
self.cmd_endpoint = connect_address(settings.PROTOCOL, settings.HOSTNAME, settings.COMMANDING_PORT)
|
|
438
|
-
|
|
439
|
-
monitoring_address = connect_address(settings.PROTOCOL, settings.HOSTNAME, settings.MONITORING_PORT)
|
|
440
|
-
self.monitoring_socket = zmq.Context().socket(zmq.SUB)
|
|
441
|
-
self.monitoring_socket.connect(monitoring_address)
|
|
442
|
-
self.monitoring_socket.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
443
|
-
self.monitoring_timeout = 1.0
|
|
444
|
-
|
|
445
|
-
self.start_fov_hk_acquisition()
|
|
446
|
-
|
|
447
|
-
def acquire_fov_hk(self):
|
|
448
|
-
|
|
449
|
-
while self.keep_acquiring_fov_hk:
|
|
450
|
-
|
|
451
|
-
try:
|
|
452
|
-
|
|
453
|
-
socket_list, _, _ = zmq.select([self.monitoring_socket], [], [], timeout=self.monitoring_timeout)
|
|
454
|
-
|
|
455
|
-
# Monitoring information was received (before timeout)
|
|
456
|
-
|
|
457
|
-
if self.monitoring_socket in socket_list:
|
|
458
|
-
|
|
459
|
-
pickle_string = self.monitoring_socket.recv()
|
|
460
|
-
monitoring_info = pickle.loads(pickle_string)
|
|
461
|
-
|
|
462
|
-
# Retrieve the rotation angles around the y- and z-axis [degrees]
|
|
463
|
-
# (the rotation angle around the x-axis and the translation are not needed here)
|
|
464
|
-
|
|
465
|
-
rot_y_z_mini = 1 / 3600 # lower threshold: 1 arcsecond = 1/3600 degree
|
|
466
|
-
|
|
467
|
-
*_, hexapod_rot_y, hexapod_rot_z = monitoring_info["user"]
|
|
468
|
-
|
|
469
|
-
if hexapod_rot_y < rot_y_z_mini and hexapod_rot_z < rot_y_z_mini:
|
|
470
|
-
theta = 0
|
|
471
|
-
phi = 0
|
|
472
|
-
|
|
473
|
-
else:
|
|
474
|
-
hexapod_rot_y = radians(hexapod_rot_y) # Rotation angle around the x-axis [radians]
|
|
475
|
-
hexapod_rot_z = radians(hexapod_rot_z) # Rotation angle around the y-axis [radians]
|
|
476
|
-
|
|
477
|
-
theta = degrees(acos(cos(hexapod_rot_y) * cos(hexapod_rot_z)))
|
|
478
|
-
phi = degrees(atan2(sin(hexapod_rot_z), -sin(hexapod_rot_y) * cos(hexapod_rot_z)))
|
|
479
|
-
|
|
480
|
-
store_actual_fov_position(theta, phi)
|
|
481
|
-
|
|
482
|
-
elif is_control_server_active(self.cmd_endpoint):
|
|
483
|
-
self.monitoring_timeout += 0.5
|
|
484
|
-
|
|
485
|
-
except zmq.ZMQError:
|
|
486
|
-
pass
|
|
487
|
-
|
|
488
|
-
def close_sockets(self):
|
|
489
|
-
|
|
490
|
-
self.monitoring_socket.close()
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
def _ias_start(commander, poller):
|
|
494
|
-
""" Start the generation of FOV position HK for IAS.
|
|
495
|
-
|
|
496
|
-
This process will only store the actual FOV position (in field angles, expressed in degrees). The commanded
|
|
497
|
-
position needs to be stored from the MGSE commanding in plato-test-scripts.
|
|
498
|
-
|
|
499
|
-
This function should never be called. Instead, call the generic function start().
|
|
500
|
-
|
|
501
|
-
Args:
|
|
502
|
-
- commander: Commanding socket for the FOV HK generation.
|
|
503
|
-
- poller: Poller for the FOV HK generation.
|
|
504
|
-
"""
|
|
505
|
-
|
|
506
|
-
# Calculate the field angles (theta, phi), based on the current configuration of the relevant mechanisms
|
|
507
|
-
# Call store_actual_fov_position to save them to the appropriate HK file
|
|
508
|
-
|
|
509
|
-
ias_fov_hk = IasFovHk()
|
|
510
|
-
ias_fov_hk.run(commander, poller)
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
class IntaFovHk(FovHk):
|
|
514
|
-
|
|
515
|
-
def __init__(self):
|
|
516
|
-
|
|
517
|
-
super(IntaFovHk, self).__init__()
|
|
518
|
-
|
|
519
|
-
# Create a socket and connect to the monitoring port
|
|
520
|
-
|
|
521
|
-
settings = Settings.load("Gimbal Control Server")
|
|
522
|
-
self.cmd_endpoint = connect_address(settings.PROTOCOL, settings.HOSTNAME, settings.COMMANDING_PORT)
|
|
523
|
-
|
|
524
|
-
monitoring_address = connect_address(settings.PROTOCOL, settings.HOSTNAME, settings.MONITORING_PORT)
|
|
525
|
-
self.monitoring_socket = zmq.Context().socket(zmq.SUB)
|
|
526
|
-
self.monitoring_socket.connect(monitoring_address)
|
|
527
|
-
self.monitoring_socket.setsockopt_string(zmq.SUBSCRIBE, "")
|
|
528
|
-
self.monitoring_timeout = 1.0
|
|
529
|
-
|
|
530
|
-
self.start_fov_hk_acquisition()
|
|
531
|
-
|
|
532
|
-
def acquire_fov_hk(self):
|
|
533
|
-
|
|
534
|
-
while self.keep_acquiring_fov_hk:
|
|
535
|
-
|
|
536
|
-
try:
|
|
537
|
-
|
|
538
|
-
socket_list, _, _ = zmq.select([self.monitoring_socket], [], [], timeout=self.monitoring_timeout)
|
|
539
|
-
|
|
540
|
-
# Monitoring information was received (before timeout)
|
|
541
|
-
|
|
542
|
-
if self.monitoring_socket in socket_list:
|
|
543
|
-
|
|
544
|
-
# Retrieve the rotation angles around the y- and z-axis [degrees]
|
|
545
|
-
# (the rotation angle around the x-axis and the translation are not needed here)
|
|
546
|
-
|
|
547
|
-
pickle_string = self.monitoring_socket.recv()
|
|
548
|
-
monitoring_info = pickle.loads(pickle_string)
|
|
549
|
-
|
|
550
|
-
# Retrieve the rotation angles around the x- and y-axis [degrees]
|
|
551
|
-
# See GimbalProtocol.get_status for details
|
|
552
|
-
grx, gry = monitoring_info["user"]
|
|
553
|
-
|
|
554
|
-
#
|
|
555
|
-
# According to inta_point_source_to_fov:
|
|
556
|
-
# grx = np.rad2deg(-np.arcsin(np.sin(np.deg2rad(theta)) * np.sin(np.deg2rad(phi))))
|
|
557
|
-
# gry = np.rad2deg(np.arctan2(np.sin(np.deg2rad(theta)) * np.cos(np.deg2rad(phi)), np.cos(np.deg2rad(theta))))
|
|
558
|
-
#
|
|
559
|
-
# grx and gry are already in degrees, therefore:
|
|
560
|
-
#
|
|
561
|
-
|
|
562
|
-
theta = np.rad2deg(np.arccos(np.cos(np.deg2rad(grx))*np.cos(np.deg2rad(gry))))
|
|
563
|
-
phi = np.rad2deg(np.arctan2(-np.sin(np.deg2rad(grx)), np.cos(np.deg2rad(grx))*np.sin(np.deg2rad(gry))))
|
|
564
|
-
|
|
565
|
-
store_actual_fov_position(theta, phi)
|
|
566
|
-
|
|
567
|
-
elif is_control_server_active(self.cmd_endpoint):
|
|
568
|
-
self.monitoring_timeout += 0.5
|
|
569
|
-
|
|
570
|
-
except zmq.ZMQError:
|
|
571
|
-
pass
|
|
572
|
-
|
|
573
|
-
def close_sockets(self):
|
|
574
|
-
self.cmd_endpoint.close()
|
|
575
|
-
self.monitoring_socket.close()
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
def _inta_start(commander, poller):
|
|
579
|
-
""" Start the generation of FOV position HK for INTA.
|
|
580
|
-
|
|
581
|
-
This process will only store the actual FOV position (in field angles, expressed in degrees). The commanded
|
|
582
|
-
position needs to be stored from the MGSE commanding in plato-test-scripts.
|
|
583
|
-
|
|
584
|
-
This function should never be called. Instead, call the generic function start().
|
|
585
|
-
|
|
586
|
-
Args:
|
|
587
|
-
- commander: Commanding socket for the FOV HK generation.
|
|
588
|
-
- poller: Poller for the FOV HK generation.
|
|
589
|
-
"""
|
|
590
|
-
|
|
591
|
-
# Calculate the field angles (theta, phi), based on the current configuration of the relevant mechanisms
|
|
592
|
-
# Call store_actual_fov_position to save them to the appropriate HK file
|
|
593
|
-
|
|
594
|
-
inta_fov_hk = IntaFovHk()
|
|
595
|
-
inta_fov_hk.run(commander, poller)
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
@cli.command()
|
|
599
|
-
def stop():
|
|
600
|
-
"""Stop the FOV HK Control Server. """
|
|
601
|
-
|
|
602
|
-
# In the while True loop in the start command, _should_stop needs to force a break from the loop.When this happens
|
|
603
|
-
# (and also when a keyboard interrupt has been caught), the monitoring socket needs to be closed (this needs to be
|
|
604
|
-
# done in the TH - specific implementation of _start). Unregistering from the Storage Manager is done
|
|
605
|
-
# automatically.
|
|
606
|
-
|
|
607
|
-
response = send_request("quit")
|
|
608
|
-
if response == "ACK":
|
|
609
|
-
rich.print("FOV HK successfully terminated.")
|
|
610
|
-
else:
|
|
611
|
-
rich.print(f"[red] ERROR: {response}")
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
@cli.command()
|
|
615
|
-
def status():
|
|
616
|
-
"""Print the status of the FOV HK Control Server."""
|
|
617
|
-
|
|
618
|
-
rich.print("FOV HK:")
|
|
619
|
-
|
|
620
|
-
response = send_request("status")
|
|
621
|
-
|
|
622
|
-
if response.get("status") == "ACK":
|
|
623
|
-
rich.print(" Status: [green]active")
|
|
624
|
-
rich.print(f" Hostname: {response.get('host')}")
|
|
625
|
-
rich.print(f" Commanding port: {response.get('command_port')}")
|
|
626
|
-
else:
|
|
627
|
-
rich.print(" Status: [red]not active")
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
def send_request(command_request: str):
|
|
631
|
-
"""Sends a request to the FOV HK Control Server and waits for a response.
|
|
632
|
-
|
|
633
|
-
Args:
|
|
634
|
-
- command_request: Request.
|
|
635
|
-
|
|
636
|
-
Returns: Response to the request.
|
|
637
|
-
"""
|
|
638
|
-
|
|
639
|
-
ctx = zmq.Context().instance()
|
|
640
|
-
endpoint = connect_address(CTRL_SETTINGS.PROTOCOL, CTRL_SETTINGS.HOSTNAME, CTRL_SETTINGS.COMMANDING_PORT)
|
|
641
|
-
socket = ctx.socket(zmq.REQ)
|
|
642
|
-
socket.connect(endpoint)
|
|
643
|
-
|
|
644
|
-
socket.send(pickle.dumps(command_request))
|
|
645
|
-
rlist, _, _ = zmq.select([socket], [], [], timeout=TIMEOUT_RECV)
|
|
646
|
-
|
|
647
|
-
if socket in rlist:
|
|
648
|
-
response = socket.recv()
|
|
649
|
-
response = pickle.loads(response)
|
|
650
|
-
else:
|
|
651
|
-
response = {"error": "Receive from ZeroMQ socket timed out for FOV HK Control Server."}
|
|
652
|
-
socket.close(linger=0)
|
|
653
|
-
|
|
654
|
-
return response
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
def _check_commander_status(commander, poller) -> bool:
|
|
658
|
-
""" Check the status of the commander.
|
|
659
|
-
|
|
660
|
-
Checks whether a command has been received by the given commander.
|
|
661
|
-
|
|
662
|
-
Returns: True if a quit command was received; False otherwise.
|
|
663
|
-
|
|
664
|
-
Args:
|
|
665
|
-
- commander: Commanding socket for the FOV HK generation.
|
|
666
|
-
- poller: Poller for the FOV HK generation.
|
|
667
|
-
"""
|
|
668
|
-
|
|
669
|
-
socks = dict(poller.poll(timeout=10)) # Timeout of 10ms
|
|
670
|
-
|
|
671
|
-
if commander in socks:
|
|
672
|
-
pickle_string = commander.recv()
|
|
673
|
-
command = pickle.loads(pickle_string)
|
|
674
|
-
|
|
675
|
-
if command.lower() == "quit":
|
|
676
|
-
commander.send(pickle.dumps("ACK"))
|
|
677
|
-
return True
|
|
678
|
-
|
|
679
|
-
if command.lower() == "status":
|
|
680
|
-
response = dict(
|
|
681
|
-
status="ACK",
|
|
682
|
-
host=CTRL_SETTINGS.HOSTNAME,
|
|
683
|
-
command_port=CTRL_SETTINGS.COMMANDING_PORT
|
|
684
|
-
)
|
|
685
|
-
commander.send(pickle.dumps(response))
|
|
686
|
-
return False
|
|
687
|
-
|
|
688
|
-
return False
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
# def handle_command(command) -> dict:
|
|
692
|
-
# """Handle commands that are sent to the commanding socket."""
|
|
693
|
-
#
|
|
694
|
-
# response = dict(
|
|
695
|
-
# timestamp=format_datetime(),
|
|
696
|
-
# )
|
|
697
|
-
#
|
|
698
|
-
# if command.lower() == 'status':
|
|
699
|
-
# response.update(dict(status="ACK",
|
|
700
|
-
# host=CTRL_SETTINGS.HOSTNAME,
|
|
701
|
-
# listening_port=,
|
|
702
|
-
# command_port=CTRL_SETTINGS.COMMANDING_PORT
|
|
703
|
-
# ))
|
|
704
|
-
#
|
|
705
|
-
# return response
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
if __name__ == "__main__":
|
|
709
|
-
|
|
710
|
-
sys.exit(cli())
|