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/search.py
DELETED
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
The search module defines some generic search functions.
|
|
3
|
-
|
|
4
|
-
This code is taken from the book:
|
|
5
|
-
|
|
6
|
-
Classic Computer Science Problems in Python, David Kopec, 2019.
|
|
7
|
-
"""
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
from collections import deque
|
|
11
|
-
from typing import TypeVar, Iterable, Sequence, Generic, List, \
|
|
12
|
-
Callable, Set, Deque, Dict, Any, Optional
|
|
13
|
-
from typing_extensions import Protocol
|
|
14
|
-
from heapq import heappush, heappop
|
|
15
|
-
|
|
16
|
-
T = TypeVar('T')
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def linear_contains(iterable: Iterable[T], key: T) -> bool:
|
|
20
|
-
for item in iterable:
|
|
21
|
-
if item == key:
|
|
22
|
-
return True
|
|
23
|
-
return False
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
# Note that Protocol is used here to define the Comparable type with structural
|
|
27
|
-
# sub-typing. A Comparable type implements the comparison operators.
|
|
28
|
-
# Protocol is defined in PEP-544 [https://www.python.org/dev/peps/pep-0544/]
|
|
29
|
-
|
|
30
|
-
C = TypeVar('C', bound='Comparable')
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class Comparable(Protocol):
|
|
34
|
-
def __eq__(self, other: Any) -> bool:
|
|
35
|
-
...
|
|
36
|
-
|
|
37
|
-
def __lt__(self: C, other: C) -> bool:
|
|
38
|
-
...
|
|
39
|
-
|
|
40
|
-
def __gt__(self: C, other: C) -> bool:
|
|
41
|
-
return (not self < other) and self != other
|
|
42
|
-
|
|
43
|
-
def __le__(self: C, other: C) -> bool:
|
|
44
|
-
return self < other or self == other
|
|
45
|
-
|
|
46
|
-
def __ge__(self: C, other: C) -> bool:
|
|
47
|
-
return not self < other
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def binary_contains(sequence: Sequence[C], key: C) -> bool:
|
|
51
|
-
low: int = 0
|
|
52
|
-
high: int = len(sequence) - 1
|
|
53
|
-
while low <= high: # while there is still a search space
|
|
54
|
-
mid: int = (low + high) // 2
|
|
55
|
-
if sequence[mid] < key:
|
|
56
|
-
low = mid + 1
|
|
57
|
-
elif sequence[mid] > key:
|
|
58
|
-
high = mid - 1
|
|
59
|
-
else:
|
|
60
|
-
return True
|
|
61
|
-
return False
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
class Stack(Generic[T]):
|
|
65
|
-
def __init__(self) -> None:
|
|
66
|
-
self._container: List[T] = []
|
|
67
|
-
|
|
68
|
-
@property
|
|
69
|
-
def empty(self) -> bool:
|
|
70
|
-
return not self._container
|
|
71
|
-
|
|
72
|
-
def push(self, item: T) -> None:
|
|
73
|
-
self._container.append(item)
|
|
74
|
-
|
|
75
|
-
def pop(self) -> T:
|
|
76
|
-
return self._container.pop() # LIFO
|
|
77
|
-
|
|
78
|
-
def __repr__(self) -> str:
|
|
79
|
-
return repr(self._container)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
class Node(Generic[T]):
|
|
83
|
-
def __init__(self, state: T, parent: Optional[Node], cost: float = 0.0, heuristic: float = 0.0) -> None:
|
|
84
|
-
self.state: T = state
|
|
85
|
-
self.parent: Optional[Node] = parent
|
|
86
|
-
self.cost: float = cost
|
|
87
|
-
self.heuristic: float = heuristic
|
|
88
|
-
|
|
89
|
-
def __lt__(self, other: Node) -> bool:
|
|
90
|
-
return (self.cost + self.heuristic) < (other.cost + other.heuristic)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def depth_first_search(initial: T, goal_test: Callable[[T], bool], successors: Callable[[T], List[T]]) -> Optional[Node[T]]:
|
|
94
|
-
"""
|
|
95
|
-
The depth-first search (DFS) algorithm goes as deeply as it can before backtracking to its
|
|
96
|
-
last decision point if it reaches a dead end.
|
|
97
|
-
|
|
98
|
-
Args:
|
|
99
|
-
initial: starting point for the search
|
|
100
|
-
goal_test: function that defines if the goal is reached or not
|
|
101
|
-
successors: function that returns all possible states that can be visited next
|
|
102
|
-
|
|
103
|
-
Returns:
|
|
104
|
-
the Node encapsulating the goal state if successful, otherwise None.
|
|
105
|
-
"""
|
|
106
|
-
frontier: Stack[Node[T]] = Stack()
|
|
107
|
-
frontier.push(Node(initial, None))
|
|
108
|
-
explored: Set[T] = set(initial)
|
|
109
|
-
|
|
110
|
-
while not frontier.empty:
|
|
111
|
-
current_node: Node[T] = frontier.pop()
|
|
112
|
-
current_state: T = current_node.state
|
|
113
|
-
|
|
114
|
-
if goal_test(current_state):
|
|
115
|
-
return current_node
|
|
116
|
-
|
|
117
|
-
for child in successors(current_state):
|
|
118
|
-
if child in explored:
|
|
119
|
-
continue
|
|
120
|
-
explored.add(child)
|
|
121
|
-
frontier.push(Node(child, current_node))
|
|
122
|
-
|
|
123
|
-
return None # we went through everything and never found goal
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def node_to_path(node: Node[T]) -> List[T]:
|
|
127
|
-
"""
|
|
128
|
-
Returns the path that was followed from a starting state to reach a goal.
|
|
129
|
-
|
|
130
|
-
Args:
|
|
131
|
-
node:
|
|
132
|
-
|
|
133
|
-
Returns:
|
|
134
|
-
a list of states that were visited to reach the final goal.
|
|
135
|
-
"""
|
|
136
|
-
path: List[T] = [node.state]
|
|
137
|
-
|
|
138
|
-
while node.parent is not None:
|
|
139
|
-
node = node.parent
|
|
140
|
-
path.append(node.state)
|
|
141
|
-
path.reverse()
|
|
142
|
-
return path
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
class Queue(Generic[T]):
|
|
146
|
-
def __init__(self) -> None:
|
|
147
|
-
self._container: Deque[T] = deque()
|
|
148
|
-
|
|
149
|
-
@property
|
|
150
|
-
def empty(self) -> bool:
|
|
151
|
-
return not self._container
|
|
152
|
-
|
|
153
|
-
def push(self, item: T) -> None:
|
|
154
|
-
self._container.append(item)
|
|
155
|
-
|
|
156
|
-
def pop(self) -> T:
|
|
157
|
-
return self._container.popleft()
|
|
158
|
-
|
|
159
|
-
def __repr__(self) -> str:
|
|
160
|
-
return repr(self._container)
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
def breadth_first_search(initial: T, goal_test: Callable[[T], bool], successors: Callable[[T], List[T]]) -> Optional[Node[T]]:
|
|
164
|
-
frontier: Queue[Node[T]] = Queue()
|
|
165
|
-
frontier.push(Node(initial, None))
|
|
166
|
-
explored: Set[T] = set(initial)
|
|
167
|
-
|
|
168
|
-
while not frontier.empty:
|
|
169
|
-
current_node: Node[T] = frontier.pop()
|
|
170
|
-
current_state: T = current_node.state
|
|
171
|
-
|
|
172
|
-
if goal_test(current_state):
|
|
173
|
-
return current_node
|
|
174
|
-
|
|
175
|
-
for child in successors(current_state):
|
|
176
|
-
if child in explored:
|
|
177
|
-
continue
|
|
178
|
-
explored.add(child)
|
|
179
|
-
frontier.push(Node(child, current_node))
|
|
180
|
-
|
|
181
|
-
return None # we went through everything and never found goal
|
|
182
|
-
|
egse/serialdevice.py
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module defines a generic base class for serial based device interface classes.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import logging
|
|
6
|
-
from serial import Serial, SerialTimeoutException, SerialException
|
|
7
|
-
from threading import Lock
|
|
8
|
-
|
|
9
|
-
from egse.decorators import dynamic_interface
|
|
10
|
-
from egse.device import DeviceConnectionInterface
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
logger = logging.getLogger(__name__)
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class SerialDevice(DeviceConnectionInterface):
|
|
17
|
-
""" Generic base class for serial based device interface classes.
|
|
18
|
-
|
|
19
|
-
This base class handles the serial connection.
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def __init__(self, port=None, baudrate=9600, terminator='\r', timeout=5, encoding='ascii', errors='strict'):
|
|
24
|
-
self._port = port
|
|
25
|
-
self._baudrate = baudrate
|
|
26
|
-
self._terminator = terminator
|
|
27
|
-
self._encoding = encoding
|
|
28
|
-
self._errors = errors
|
|
29
|
-
self._timeout = timeout
|
|
30
|
-
self._serial = None
|
|
31
|
-
self._connected = False
|
|
32
|
-
self._lock = Lock()
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
@dynamic_interface
|
|
36
|
-
def get_idn(self):
|
|
37
|
-
""" Get the device ID string
|
|
38
|
-
|
|
39
|
-
Child classes must implement this function because it is required for `is_connected()`
|
|
40
|
-
|
|
41
|
-
Raises:
|
|
42
|
-
ConnectionError: when the connection failed.
|
|
43
|
-
"""
|
|
44
|
-
raise NotImplementedError
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
def is_simulator(self):
|
|
48
|
-
|
|
49
|
-
return False
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def connect(self):
|
|
53
|
-
""" Create the serial conection.
|
|
54
|
-
|
|
55
|
-
Raises a ConnectionError on failure.
|
|
56
|
-
"""
|
|
57
|
-
|
|
58
|
-
# Sanity checks
|
|
59
|
-
if self._connected:
|
|
60
|
-
raise ConnectionError("Serial connection is already open")
|
|
61
|
-
if self._port in (None, ""):
|
|
62
|
-
raise ValueError("Serial port not initialized")
|
|
63
|
-
if self._baudrate in (None, 0):
|
|
64
|
-
raise ValueError("Baudrate not initialized")
|
|
65
|
-
|
|
66
|
-
# Create a new serial connection
|
|
67
|
-
try:
|
|
68
|
-
self._serial = Serial(port=self._port, baudrate=self._baudrate,
|
|
69
|
-
timeout=self._timeout, write_timeout=self._timeout)
|
|
70
|
-
except ValueError as e_value:
|
|
71
|
-
raise ConnectionError("Invalid parameters for serial connection") from e_value
|
|
72
|
-
except SerialException as e_serial:
|
|
73
|
-
raise ConnectionError("Failed to open serial device.") from e_serial
|
|
74
|
-
|
|
75
|
-
self._connected = True
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def disconnect(self):
|
|
79
|
-
""" Disconnect from the serial connection.
|
|
80
|
-
|
|
81
|
-
Raises a ConnectionError on failure.
|
|
82
|
-
"""
|
|
83
|
-
|
|
84
|
-
try:
|
|
85
|
-
if self._connected:
|
|
86
|
-
logger.debug(f"Disconnecting from {self._port}")
|
|
87
|
-
with self._lock:
|
|
88
|
-
self._serial.close()
|
|
89
|
-
self._connected = False
|
|
90
|
-
except Exception as e_exc:
|
|
91
|
-
raise ConnectionError(f"Could not close serial connection to {self._port}") from e_exc
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def reconnect(self):
|
|
95
|
-
""" Disconnect the serial connection if it is already connected and try to connect.
|
|
96
|
-
"""
|
|
97
|
-
|
|
98
|
-
if self._connected:
|
|
99
|
-
self.disconnect()
|
|
100
|
-
|
|
101
|
-
self.connect()
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def is_connected(self):
|
|
105
|
-
""" Check if the socket connection to the device is active.
|
|
106
|
-
This function assumes the child class implements the get_idn method.
|
|
107
|
-
"""
|
|
108
|
-
|
|
109
|
-
if not self._connected:
|
|
110
|
-
return False
|
|
111
|
-
|
|
112
|
-
try:
|
|
113
|
-
response = self.get_idn()
|
|
114
|
-
except ConnectionError as err:
|
|
115
|
-
logger.error(f'While trying to talk to the device the following exception occured,',
|
|
116
|
-
'exception={err}')
|
|
117
|
-
self.disconnect()
|
|
118
|
-
return False
|
|
119
|
-
|
|
120
|
-
return True
|
|
121
|
-
|
|
122
|
-
def send_command(self, command: str):
|
|
123
|
-
"""
|
|
124
|
-
Send a single command to the device controller without waiting for a response.
|
|
125
|
-
|
|
126
|
-
Args:
|
|
127
|
-
command: an order command for the controller.
|
|
128
|
-
|
|
129
|
-
Raises:
|
|
130
|
-
ConnectionError when the command could not be sent due to a timeout or a communication
|
|
131
|
-
problem.
|
|
132
|
-
"""
|
|
133
|
-
|
|
134
|
-
# print("send: ", repr(command))
|
|
135
|
-
|
|
136
|
-
try:
|
|
137
|
-
with self._lock:
|
|
138
|
-
self._serial.write(command.encode(encoding=self._encoding, errors=self._errors))
|
|
139
|
-
|
|
140
|
-
except SerialTimeoutException as e_timeout:
|
|
141
|
-
raise ConnectionError("Serial timeout error") from e_timeout
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
def read(self):
|
|
145
|
-
"""
|
|
146
|
-
Read a response from the device until a termination character is encountered.
|
|
147
|
-
|
|
148
|
-
Returns:
|
|
149
|
-
Either a string returned by the controller (on success), or an error message (on
|
|
150
|
-
failure).
|
|
151
|
-
|
|
152
|
-
Raises:
|
|
153
|
-
ConnectionError when there was an I/O problem during communication with the
|
|
154
|
-
controller.
|
|
155
|
-
"""
|
|
156
|
-
|
|
157
|
-
try:
|
|
158
|
-
with self._lock:
|
|
159
|
-
# Read the response
|
|
160
|
-
# NOTE: the serial module reads until it encounters the \n termination character
|
|
161
|
-
return_string = self._serial.read_until(self._terminator.encode(encoding=self._encoding, errors=self._errors), size=1024)
|
|
162
|
-
# print(f"recv: ", repr(return_string))
|
|
163
|
-
|
|
164
|
-
return return_string.decode(encoding=self._encoding, errors=self._errors)
|
|
165
|
-
|
|
166
|
-
except SerialTimeoutException as e_timeout:
|
|
167
|
-
raise ConnectionError("Serial timeout during query") from e_timeout
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
def query(self, command: str):
|
|
171
|
-
"""
|
|
172
|
-
Send a single command to the device controller and block until a response from the
|
|
173
|
-
controller. This function can be overridden by the child class to implement device specific
|
|
174
|
-
sanity checks on the reponse.
|
|
175
|
-
|
|
176
|
-
Args:
|
|
177
|
-
command: is the command to be sent
|
|
178
|
-
|
|
179
|
-
Returns:
|
|
180
|
-
Either a string returned by the controller (on success), or an error message (on
|
|
181
|
-
failure).
|
|
182
|
-
|
|
183
|
-
Raises:
|
|
184
|
-
ConnectionError when there was an I/O problem during communication with the
|
|
185
|
-
controller.
|
|
186
|
-
"""
|
|
187
|
-
|
|
188
|
-
# Attempt to send the command
|
|
189
|
-
self.send_command(command)
|
|
190
|
-
return self.read()
|
egse/services.py
DELETED
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module provides the services to the control servers.
|
|
3
|
-
|
|
4
|
-
Each control server has a services protocol which provides commands that will
|
|
5
|
-
be executed on the control server instead of the device controller. This is
|
|
6
|
-
typically used to access control server specific settings like monitoring frequency,
|
|
7
|
-
logging levels, or to quit the control server in a controlled way.
|
|
8
|
-
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
import inspect
|
|
12
|
-
import logging
|
|
13
|
-
|
|
14
|
-
from egse.command import ClientServerCommand
|
|
15
|
-
from egse.control import ControlServer
|
|
16
|
-
from egse.decorators import dynamic_interface
|
|
17
|
-
from egse.protocol import CommandProtocol
|
|
18
|
-
from egse.proxy import Proxy
|
|
19
|
-
from egse.settings import Settings
|
|
20
|
-
from egse.zmq_ser import bind_address
|
|
21
|
-
from egse.zmq_ser import connect_address
|
|
22
|
-
|
|
23
|
-
LOGGER = logging.getLogger(__name__)
|
|
24
|
-
|
|
25
|
-
SERVICE_SETTINGS = Settings.load(filename="services.yaml")
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class ServiceCommand(ClientServerCommand):
|
|
29
|
-
pass
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class ServiceProtocol(CommandProtocol):
|
|
33
|
-
def __init__(self, control_server: ControlServer):
|
|
34
|
-
super().__init__()
|
|
35
|
-
self.control_server = control_server
|
|
36
|
-
|
|
37
|
-
self.load_commands(SERVICE_SETTINGS.Commands, ServiceCommand, ServiceProtocol)
|
|
38
|
-
|
|
39
|
-
def get_bind_address(self):
|
|
40
|
-
return bind_address(self.control_server.get_communication_protocol(), self.control_server.get_service_port())
|
|
41
|
-
|
|
42
|
-
def get_status(self):
|
|
43
|
-
return super().get_status()
|
|
44
|
-
|
|
45
|
-
def handle_set_monitoring_frequency(self, freq: float):
|
|
46
|
-
"""
|
|
47
|
-
Sets the monitoring frequency (Hz) to the given freq value. This is only approximate since the frequency is
|
|
48
|
-
converted into a delay time and the actual execution of the status function is subject to the load on the
|
|
49
|
-
server and the overhead of the timing.
|
|
50
|
-
|
|
51
|
-
Args:
|
|
52
|
-
freq: frequency of execution (Hz)
|
|
53
|
-
|
|
54
|
-
Returns:
|
|
55
|
-
Sends back the selected delay time in milliseconds.
|
|
56
|
-
"""
|
|
57
|
-
delay = self.control_server.set_delay(1.0 / freq)
|
|
58
|
-
|
|
59
|
-
LOGGER.debug(f"Set monitoring frequency to {freq}Hz, ± every {delay:.0f}ms.")
|
|
60
|
-
|
|
61
|
-
self.send(delay)
|
|
62
|
-
|
|
63
|
-
def handle_set_hk_frequency(self, freq: float):
|
|
64
|
-
"""
|
|
65
|
-
Sets the housekeeping frequency (Hz) to the given freq value. This is only approximate since the frequency is
|
|
66
|
-
converted into a delay time and the actual execution of the `housekeeping` function is subject to the load on
|
|
67
|
-
the server and the overhead of the timing.
|
|
68
|
-
|
|
69
|
-
Args:
|
|
70
|
-
freq: frequency of execution (Hz)
|
|
71
|
-
|
|
72
|
-
Returns:
|
|
73
|
-
Sends back the selected delay time in milliseconds.
|
|
74
|
-
"""
|
|
75
|
-
delay = self.control_server.set_hk_delay(1.0 / freq)
|
|
76
|
-
|
|
77
|
-
LOGGER.debug(f"Set housekeeping frequency to {freq}Hz, ± every {delay:.0f}ms.")
|
|
78
|
-
|
|
79
|
-
self.send(delay)
|
|
80
|
-
|
|
81
|
-
def handle_set_logging_level(self, *args, **kwargs):
|
|
82
|
-
"""
|
|
83
|
-
Set the logging level for the logger with the given name.
|
|
84
|
-
|
|
85
|
-
When 'all' is given for the name of the logger, the level of all loggers for which the name
|
|
86
|
-
starts with 'egse' will be changed to `level`.
|
|
87
|
-
|
|
88
|
-
Args:
|
|
89
|
-
name (str): the name of an existing Logger
|
|
90
|
-
level (int): the logging level
|
|
91
|
-
|
|
92
|
-
Returns:
|
|
93
|
-
Sends back an info message on what level was set.
|
|
94
|
-
"""
|
|
95
|
-
if args:
|
|
96
|
-
name = args[0]
|
|
97
|
-
level = int(args[1])
|
|
98
|
-
else:
|
|
99
|
-
name = kwargs['name']
|
|
100
|
-
level = int(kwargs['level'])
|
|
101
|
-
|
|
102
|
-
if name == 'all':
|
|
103
|
-
for logger in [logging.getLogger(logger_name)
|
|
104
|
-
for logger_name in logging.root.manager.loggerDict
|
|
105
|
-
if logger_name.startswith('egse')]:
|
|
106
|
-
logger.setLevel(level)
|
|
107
|
-
msg = f"Logging level set to {level} for ALL 'egse' loggers"
|
|
108
|
-
elif name in logging.root.manager.loggerDict:
|
|
109
|
-
logger = logging.getLogger(name)
|
|
110
|
-
logger.setLevel(level)
|
|
111
|
-
msg = f"Logging level for {name} set to {level}."
|
|
112
|
-
else:
|
|
113
|
-
msg = f"Logger with name '{name}' doesn't exist at the server side."
|
|
114
|
-
|
|
115
|
-
# self.control_server.set_logging_level(level)
|
|
116
|
-
logging.debug(msg)
|
|
117
|
-
self.send(msg)
|
|
118
|
-
|
|
119
|
-
def handle_quit(self):
|
|
120
|
-
LOGGER.info(f"Sending interrupt to {self.control_server.__class__.__name__}.")
|
|
121
|
-
self.control_server.quit()
|
|
122
|
-
self.send(f"Sent interrupt to {self.control_server.__class__.__name__}.")
|
|
123
|
-
|
|
124
|
-
def handle_get_process_status(self):
|
|
125
|
-
LOGGER.debug(f"Asking for process status of {self.control_server.__class__.__name__}.")
|
|
126
|
-
self.send(self.get_status())
|
|
127
|
-
|
|
128
|
-
def handle_get_cs_module(self):
|
|
129
|
-
"""
|
|
130
|
-
Returns the module in which the control server has been implemented.
|
|
131
|
-
"""
|
|
132
|
-
LOGGER.debug(f"Asking for module of {self.control_server.__class__.__name__}.")
|
|
133
|
-
self.send(inspect.getmodule(self.control_server).__spec__.name)
|
|
134
|
-
|
|
135
|
-
def handle_get_average_execution_times(self):
|
|
136
|
-
LOGGER.debug(f"Asking for average execution times of {self.control_server.__class__.__name__} functions.")
|
|
137
|
-
self.send(self.control_server.get_average_execution_times())
|
|
138
|
-
|
|
139
|
-
def handle_get_storage_mnemonic(self):
|
|
140
|
-
LOGGER.debug(f"Asking for the storage menmonic of {self.control_server.__class__.__name__}.")
|
|
141
|
-
self.send(self.control_server.get_storage_mnemonic())
|
|
142
|
-
|
|
143
|
-
def handle_add_listener(self, listener: dict):
|
|
144
|
-
LOGGER.debug(f"Add listener to {self.control_server.__class__.__name__}: {listener}")
|
|
145
|
-
try:
|
|
146
|
-
self.control_server.listeners.add_listener(listener)
|
|
147
|
-
LOGGER.info(f"Registered listener: {listener['name']} with proxy {listener['proxy']}")
|
|
148
|
-
self.send(("ACK",))
|
|
149
|
-
except ValueError as exc:
|
|
150
|
-
self.send(("NACK", exc)) # Why not send back a failure object?
|
|
151
|
-
|
|
152
|
-
def handle_remove_listener(self, listener: dict):
|
|
153
|
-
LOGGER.debug(f"Remove listener from {self.control_server.__class__.__name__}: {listener}")
|
|
154
|
-
try:
|
|
155
|
-
self.control_server.listeners.remove_listener(listener)
|
|
156
|
-
LOGGER.info(f"Removed listener: {listener['name']}")
|
|
157
|
-
self.send(("ACK",))
|
|
158
|
-
except ValueError as exc:
|
|
159
|
-
self.send(("NACK", exc)) # Why not send back a failure object?
|
|
160
|
-
|
|
161
|
-
def handle_get_listener_names(self):
|
|
162
|
-
LOGGER.debug(f"Get names of registered listener from {self.control_server.__class__.__name__}")
|
|
163
|
-
try:
|
|
164
|
-
names = self.control_server.listeners.get_listener_names()
|
|
165
|
-
self.send((names,))
|
|
166
|
-
except ValueError as exc:
|
|
167
|
-
self.send(("", exc)) # Why not sent back a Failure object?
|
|
168
|
-
|
|
169
|
-
class ServiceInterface:
|
|
170
|
-
@dynamic_interface
|
|
171
|
-
def set_monitoring_frequency(self, freq: float):
|
|
172
|
-
...
|
|
173
|
-
@dynamic_interface
|
|
174
|
-
def set_hk_frequency(self, freq: float):
|
|
175
|
-
...
|
|
176
|
-
@dynamic_interface
|
|
177
|
-
def set_logging_level(self, name: str, level: int):
|
|
178
|
-
...
|
|
179
|
-
@dynamic_interface
|
|
180
|
-
def quit_server(self):
|
|
181
|
-
...
|
|
182
|
-
@dynamic_interface
|
|
183
|
-
def get_process_status(self):
|
|
184
|
-
...
|
|
185
|
-
@dynamic_interface
|
|
186
|
-
def get_cs_module(self):
|
|
187
|
-
...
|
|
188
|
-
@dynamic_interface
|
|
189
|
-
def get_average_execution_times(self):
|
|
190
|
-
...
|
|
191
|
-
@dynamic_interface
|
|
192
|
-
def get_storage_mnemonic(self):
|
|
193
|
-
...
|
|
194
|
-
@dynamic_interface
|
|
195
|
-
def add_listener(self, listener: dict):
|
|
196
|
-
...
|
|
197
|
-
@dynamic_interface
|
|
198
|
-
def remove_listener(self, listener: dict):
|
|
199
|
-
...
|
|
200
|
-
@dynamic_interface
|
|
201
|
-
def get_listener_names(self, listener: dict):
|
|
202
|
-
...
|
|
203
|
-
|
|
204
|
-
class ServiceProxy(Proxy, ServiceInterface):
|
|
205
|
-
"""
|
|
206
|
-
A ServiceProxy is a simple class that forwards service commands to a control server.
|
|
207
|
-
"""
|
|
208
|
-
|
|
209
|
-
def __init__(self, ctrl_settings=None, *, protocol=None, hostname=None, port=None):
|
|
210
|
-
"""
|
|
211
|
-
A ServiceProxy can be configured from the specific control server settings, or additional
|
|
212
|
-
arguments `protocol`, `hostname` and `port` can be passed.
|
|
213
|
-
|
|
214
|
-
The additional arguments always overwrite the values loaded from ctrl_settings. Either ctrl_settings or
|
|
215
|
-
hostname and port must be provided, protocol is optional and defaults to 'tcp'.
|
|
216
|
-
|
|
217
|
-
Args:
|
|
218
|
-
ctrl_settings: an AttributeDict with HOSTNAME, PORT and PROTOCOL attributes
|
|
219
|
-
protocol: the transport protocol [default: tcp]
|
|
220
|
-
hostname: the IP addrress of the control server
|
|
221
|
-
port: the port on which the control server is listening for service commands
|
|
222
|
-
"""
|
|
223
|
-
_protocol = _hostname = _port = None
|
|
224
|
-
if ctrl_settings:
|
|
225
|
-
_protocol = ctrl_settings.PROTOCOL
|
|
226
|
-
_hostname = ctrl_settings.HOSTNAME
|
|
227
|
-
_port = ctrl_settings.SERVICE_PORT
|
|
228
|
-
|
|
229
|
-
# the protocol argument is overwriting the standard crtl_settings
|
|
230
|
-
|
|
231
|
-
if protocol:
|
|
232
|
-
_protocol = protocol
|
|
233
|
-
|
|
234
|
-
# if still _protocol is not set, neither by ctrl_settings, nor by the protocol argument, use a default
|
|
235
|
-
|
|
236
|
-
if _protocol is None:
|
|
237
|
-
_protocol = 'tcp'
|
|
238
|
-
|
|
239
|
-
if hostname:
|
|
240
|
-
_hostname = hostname
|
|
241
|
-
if port:
|
|
242
|
-
_port = port
|
|
243
|
-
|
|
244
|
-
if _hostname is None or _port is None:
|
|
245
|
-
raise ValueError("Expected ctrl-settings or hostname and port as arguments")
|
|
246
|
-
|
|
247
|
-
super().__init__(connect_address(_protocol, _hostname, _port))
|
egse/services.yaml
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
ProxyClass:
|
|
3
|
-
egse.services.ServiceProxy
|
|
4
|
-
|
|
5
|
-
ClassDescription:
|
|
6
|
-
The Service Proxy class is used to send control commands to any of the control servers.
|
|
7
|
-
|
|
8
|
-
Commands:
|
|
9
|
-
|
|
10
|
-
set_monitoring_frequency:
|
|
11
|
-
description: Sets the monitoring frequency (Hz) to the given freq value.
|
|
12
|
-
cmd: '{freq}'
|
|
13
|
-
device_method: None
|
|
14
|
-
response: handle_set_monitoring_frequency
|
|
15
|
-
|
|
16
|
-
set_hk_frequency:
|
|
17
|
-
description: Sets the housekeeping frequency (Hz) to the given freq value.
|
|
18
|
-
cmd: '{freq}'
|
|
19
|
-
device_method: None
|
|
20
|
-
response: handle_set_hk_frequency
|
|
21
|
-
|
|
22
|
-
set_logging_level:
|
|
23
|
-
description: Set the logging level for the logger with the given name.
|
|
24
|
-
cmd: '{name} {level}'
|
|
25
|
-
device_method: None
|
|
26
|
-
response: handle_set_logging_level
|
|
27
|
-
|
|
28
|
-
quit_server:
|
|
29
|
-
description: Send an interrupt to the control server. The server will close all connections and exit.
|
|
30
|
-
device_method: None
|
|
31
|
-
response: handle_quit
|
|
32
|
-
|
|
33
|
-
get_process_status:
|
|
34
|
-
description: Ask for the process status of the control server.
|
|
35
|
-
device_method: None
|
|
36
|
-
response: handle_get_process_status
|
|
37
|
-
|
|
38
|
-
get_cs_module:
|
|
39
|
-
description: Returns the module in which the control server has been implemented.
|
|
40
|
-
device_method: None
|
|
41
|
-
response: handle_get_cs_module
|
|
42
|
-
|
|
43
|
-
get_average_execution_times:
|
|
44
|
-
description: Returns a dictionary with the average execution times of the get_housekeeping and get_status methods
|
|
45
|
-
device_method: None
|
|
46
|
-
response: handle_get_average_execution_times
|
|
47
|
-
|
|
48
|
-
get_storage_mnemonic:
|
|
49
|
-
description: Returns the mnemonic that is part of the filename where the housekeeping data are stored.
|
|
50
|
-
device_method: None
|
|
51
|
-
response: handle_get_storage_mnemonic
|
|
52
|
-
|
|
53
|
-
add_listener:
|
|
54
|
-
description: Adds a Listener process to be notified on special events.
|
|
55
|
-
cmd: '{listener}'
|
|
56
|
-
device_method: None
|
|
57
|
-
response: handle_add_listener
|
|
58
|
-
|
|
59
|
-
remove_listener:
|
|
60
|
-
description: Remove a Listener process.
|
|
61
|
-
cmd: '{listener}'
|
|
62
|
-
device_method: None
|
|
63
|
-
response: handle_remove_listener
|
|
64
|
-
|
|
65
|
-
get_listener_names:
|
|
66
|
-
description: Get the names of the registered Listener processes.
|
|
67
|
-
device_method: None
|
|
68
|
-
response: handle_get_listener_names
|