cgse 2023.38.0__py3-none-any.whl → 2024.1.3__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 +77 -0
- cgse-2024.1.3.dist-info/METADATA +41 -0
- cgse-2024.1.3.dist-info/RECORD +5 -0
- {cgse-2023.38.0.dist-info → cgse-2024.1.3.dist-info}/WHEEL +1 -2
- cgse-2023.38.0.dist-info/COPYING +0 -674
- cgse-2023.38.0.dist-info/COPYING.LESSER +0 -165
- cgse-2023.38.0.dist-info/METADATA +0 -144
- cgse-2023.38.0.dist-info/RECORD +0 -649
- cgse-2023.38.0.dist-info/entry_points.txt +0 -75
- cgse-2023.38.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5235
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -626
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -912
- 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 -234
- egse/alert/alertman_ui.py +0 -603
- 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 -130
- egse/alert/gsm/beaglebone_protocol.py +0 -48
- 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 -129
- 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 -1015
- egse/confman/confman.yaml +0 -67
- egse/confman/confman_cs.py +0 -239
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -442
- egse/coordinates/__init__.py +0 -531
- egse/coordinates/avoidance.py +0 -103
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -120
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -195
- 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 -1247
- 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 -415
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2681
- egse/dpu/ccd_ui.py +0 -508
- egse/dpu/dpu.py +0 -786
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -668
- egse/dpu/fitsgen.py +0 -2077
- egse/dpu/fitsgen_test.py +0 -752
- 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/constants.py +0 -220
- egse/dsi/esl.py +0 -870
- egse/dsi/rmap.py +0 -1042
- egse/dsi/rmapci.py +0 -37
- egse/dsi/spw.py +0 -154
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -258
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -28
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -51
- egse/fdir/fdir_manager_controller.py +0 -228
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -25
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -37
- egse/fdir/fdir_remote_controller.py +0 -50
- egse/fdir/fdir_remote_cs.py +0 -97
- egse/fdir/fdir_remote_interface.py +0 -14
- egse/fdir/fdir_remote_popup.py +0 -31
- egse/fee/__init__.py +0 -114
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/fee.py +0 -631
- egse/fee/feesim.py +0 -750
- egse/fee/n_fee_hk.py +0 -761
- egse/fee/nfee.py +0 -187
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -24
- egse/filterwheel/eksma/fw8smc4.py +0 -661
- 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 -81
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -111
- 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 -1068
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -712
- egse/fov/fov_ui.py +0 -861
- 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 -135
- 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 -1281
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -588
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- 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 -138
- 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 -196
- egse/hexapod/symetrie/puna_protocol.py +0 -131
- egse/hexapod/symetrie/puna_ui.py +0 -434
- 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 -415
- egse/hexapod/symetrie/zonda_protocol.py +0 -119
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -765
- 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 -69
- 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/macOS/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/macOS/EtherSpaceLink_v34_86.dylib +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 -73
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -98
- 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 -163
- 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 -811
- 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 -603
- egse/proxy.py +0 -522
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -675
- egse/resource.py +0 -333
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -212
- egse/services.yaml +0 -51
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1180
- 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 -69
- 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 -1479
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -247
- 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 -193
- egse/stages/arun/smd3.py +0 -111
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -472
- 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 -904
- 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 -111
- 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 -1004
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -72
- egse/storage/storage_cs.py +0 -214
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -412
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1408
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -874
- 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 -177
- 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 -116
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -99
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -117
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -101
- egse/tempcontrol/beaglebone/beaglebone.py +0 -342
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -135
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -681
- egse/tempcontrol/digalox/digalox.py +0 -107
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -112
- egse/tempcontrol/digalox/digalox_protocol.py +0 -55
- 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 -78
- 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 -73
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -389
- 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 -727
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -875
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -118
- egse/tempcontrol/srs/ptc10_protocol.py +0 -42
- 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 -164
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -193
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -92
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -128
- 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 -102
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -83
- 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 -316
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -704
- 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 -39
- egse/vacuum/pfeiffer/tc400.py +0 -113
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -140
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -24
- egse/vacuum/pfeiffer/tpg261.py +0 -81
- 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 -60
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -24
- 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 -44
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/create_hdf5_report.py +0 -295
- scripts/csl_model.py +0 -436
- scripts/csl_restore_setup.py +0 -230
- scripts/export-grafana-dashboards.py +0 -50
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -59
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -11
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -64
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -61
- 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/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/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/tm_gen/tm_gen_agilent.py +0 -38
- 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/resource.py
DELETED
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module provides convenience functions to use resources in your code without
|
|
3
|
-
the need to specify an absolute path or try to locate the resources in your local
|
|
4
|
-
installation (which is time-consuming, error-prone, and introduces quite some
|
|
5
|
-
redundancy).
|
|
6
|
-
|
|
7
|
-
Resources can be files of different format that are distributed together with the
|
|
8
|
-
source code, e.g.
|
|
9
|
-
|
|
10
|
-
* image data
|
|
11
|
-
* icons
|
|
12
|
-
* YAML files
|
|
13
|
-
* binary files, e.g. dynamic libraries
|
|
14
|
-
* style files for GUI applications
|
|
15
|
-
* calibration files distributed with the source code
|
|
16
|
-
|
|
17
|
-
Each of the resources have a fixed location within the source tree and is identified
|
|
18
|
-
with a resource identifier. There are a number of default identifier that are defined
|
|
19
|
-
as follows:
|
|
20
|
-
|
|
21
|
-
* `icons`: located in the sub-folder 'icons'
|
|
22
|
-
* `images`: located in the sub-folder 'images'
|
|
23
|
-
* `lib`: located in sub-folder 'lib'
|
|
24
|
-
|
|
25
|
-
Resource locations are determined during startup at a number of predefined
|
|
26
|
-
locations for the following resource identifiers:
|
|
27
|
-
|
|
28
|
-
* from known hardcoded folder names, e.g. 'images', 'icons', and 'lib'.
|
|
29
|
-
|
|
30
|
-
Resources can be accessed from the code without specifying the absolute pathname,
|
|
31
|
-
using a `:/resource_od/` that is known by the resource module. A wildcard can be
|
|
32
|
-
introduces after the `resource_id` to indicate the resource is in one of the
|
|
33
|
-
sub-directories.
|
|
34
|
-
|
|
35
|
-
Example usage:
|
|
36
|
-
* get_resource(":/icons/open-document.png")
|
|
37
|
-
* get_resource(":/styles/dark.qss")
|
|
38
|
-
* get_resource(":/lib/*/EtherSpaceLink_v34_86.dylib")
|
|
39
|
-
|
|
40
|
-
A new `resource_id` can be added with the `add_resource_id()` function, specifying a
|
|
41
|
-
resource_id string and location. When the `force=True` keyword is given, an existing
|
|
42
|
-
resource_id can be changed.
|
|
43
|
-
|
|
44
|
-
Alternatives
|
|
45
|
-
|
|
46
|
-
The `egse.config` module has a number of alternatives for locating files and resources.
|
|
47
|
-
|
|
48
|
-
* find_file(..) and find_files(..)
|
|
49
|
-
* find_dir(..) and find_dirs(..)
|
|
50
|
-
* get_resource_dirs()
|
|
51
|
-
* get_resource_path()
|
|
52
|
-
|
|
53
|
-
The functions for finding files and directories are more flexible, but take more
|
|
54
|
-
time and effort. They are mainly used for dynamically searching for a file or
|
|
55
|
-
folder, not necessarily within the source code location.
|
|
56
|
-
|
|
57
|
-
The resource specific functions in the egse.config module will be deprecated when
|
|
58
|
-
their functionality is fully replaced by this `egse.resource` module.
|
|
59
|
-
|
|
60
|
-
"""
|
|
61
|
-
|
|
62
|
-
import logging
|
|
63
|
-
import re
|
|
64
|
-
from pathlib import Path
|
|
65
|
-
from typing import Dict
|
|
66
|
-
from typing import Union
|
|
67
|
-
|
|
68
|
-
from egse.config import find_first_occurrence_of_dir
|
|
69
|
-
from egse.config import find_files
|
|
70
|
-
from egse.exceptions import InternalError
|
|
71
|
-
|
|
72
|
-
MODULE_LOGGER = logging.getLogger(__name__)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
class ResourceError(Exception):
|
|
76
|
-
"""Base class, raised when a resource is not defined."""
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
class AmbiguityError(ResourceError):
|
|
80
|
-
"""Raised when more than one option is possible."""
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
class NoSuchFileError(ResourceError):
|
|
84
|
-
"""Raised when no file could be found for the given resource."""
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
__all__ = [
|
|
88
|
-
"get_resource",
|
|
89
|
-
"get_resource_locations",
|
|
90
|
-
"add_resource_id",
|
|
91
|
-
"initialise_resources",
|
|
92
|
-
"ResourceError",
|
|
93
|
-
"AmbiguityError",
|
|
94
|
-
"NoSuchFileError",
|
|
95
|
-
]
|
|
96
|
-
|
|
97
|
-
# Testing regex: https://pythex.org
|
|
98
|
-
|
|
99
|
-
PATTERN = re.compile(r"^:/(\w+)/(\*+/)?(.*)$")
|
|
100
|
-
|
|
101
|
-
DEFAULT_RESOURCES = {
|
|
102
|
-
"icons": "/icons",
|
|
103
|
-
"images": "/images",
|
|
104
|
-
"lib": "/lib",
|
|
105
|
-
"styles": "/styles",
|
|
106
|
-
"data": "/data",
|
|
107
|
-
"aeudata": "/aeu/arbdata",
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
resources_root = Path(__file__).parent
|
|
111
|
-
resources = {}
|
|
112
|
-
|
|
113
|
-
__initialised__ = False
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
def check_if_file_exists(filename: Union[Path, str], resource_id: str = None) -> Path:
|
|
117
|
-
"""
|
|
118
|
-
Check if the given filename exists. If the filename exists, return the filename, else raise a
|
|
119
|
-
NoSuchFileError.
|
|
120
|
-
|
|
121
|
-
Args:
|
|
122
|
-
filename (Path|str): an absolute filename
|
|
123
|
-
resource_id (str): a resource identifier
|
|
124
|
-
|
|
125
|
-
Return:
|
|
126
|
-
The given filename if it exists.
|
|
127
|
-
|
|
128
|
-
Raises:
|
|
129
|
-
NoSuchFileError if the given filename doesn't exist.
|
|
130
|
-
"""
|
|
131
|
-
filename = Path(filename)
|
|
132
|
-
if filename.is_file():
|
|
133
|
-
return filename
|
|
134
|
-
|
|
135
|
-
if resource_id:
|
|
136
|
-
raise NoSuchFileError(
|
|
137
|
-
f"The file '{filename.name}' could not be found for the given resource '{resource_id}'")
|
|
138
|
-
else:
|
|
139
|
-
raise NoSuchFileError(f"The file '{filename.name}' doesn't exist.")
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def contains_wildcard(filename: str):
|
|
143
|
-
"""
|
|
144
|
-
Returns True if the filename contains a wildcard, otherwise False.
|
|
145
|
-
A wildcard is an asterisk '*' or a question mark '?' character.
|
|
146
|
-
"""
|
|
147
|
-
if '*' in filename:
|
|
148
|
-
return True
|
|
149
|
-
if '?' in filename:
|
|
150
|
-
return True
|
|
151
|
-
|
|
152
|
-
return False
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
def get_resource_locations() -> Dict[str, Path]:
|
|
156
|
-
"""
|
|
157
|
-
Returns a dictionary of names that can be used as resource location.
|
|
158
|
-
The keys are strings that are recognised as valid resource identifiers, the
|
|
159
|
-
values are their actual absolute path names.
|
|
160
|
-
"""
|
|
161
|
-
if not __initialised__:
|
|
162
|
-
MODULE_LOGGER.warning("Resources have not been initialised.")
|
|
163
|
-
|
|
164
|
-
return resources.copy()
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
def initialise_resources(root: Union[Path, str] = Path(__file__).parent):
|
|
168
|
-
"""
|
|
169
|
-
Initialise the default resources.
|
|
170
|
-
|
|
171
|
-
The argument `root` specifies the root location for the resources. If not specified,
|
|
172
|
-
the location of this module is taken as the root location. So, if you have installed
|
|
173
|
-
this package with `pip install`, you should give the location of your project's source
|
|
174
|
-
code as the root argument.
|
|
175
|
-
|
|
176
|
-
Args:
|
|
177
|
-
root (Path|str): the root location for the resources.
|
|
178
|
-
|
|
179
|
-
Returns:
|
|
180
|
-
None.
|
|
181
|
-
"""
|
|
182
|
-
global resources_root
|
|
183
|
-
global __initialised__
|
|
184
|
-
|
|
185
|
-
if __initialised__:
|
|
186
|
-
MODULE_LOGGER.warning("Resources have already been initialised.")
|
|
187
|
-
return
|
|
188
|
-
|
|
189
|
-
resources_root = Path(root)
|
|
190
|
-
|
|
191
|
-
# the resources with their absolute path names
|
|
192
|
-
|
|
193
|
-
for resource_id in DEFAULT_RESOURCES:
|
|
194
|
-
folder = find_first_occurrence_of_dir(DEFAULT_RESOURCES[resource_id], root=resources_root)
|
|
195
|
-
resources[resource_id] = folder
|
|
196
|
-
|
|
197
|
-
MODULE_LOGGER.debug(f"Resources have been defined: {DEFAULT_RESOURCES=}")
|
|
198
|
-
|
|
199
|
-
__initialised__ = True
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
def add_resource_id(resource_id: str, location: Union[Path, str], force=False):
|
|
203
|
-
"""
|
|
204
|
-
Adds a resource identifier with the given location. Resources can then be specified
|
|
205
|
-
using this resource id.
|
|
206
|
-
|
|
207
|
-
The location can be an absolute or relative pathname. In the latter case an
|
|
208
|
-
absolute pathname will be constructed using the resource root location that was
|
|
209
|
-
given during the initialisation (calling `initialise_resources()`).
|
|
210
|
-
|
|
211
|
-
If the resource identifier already exists, a ValueError will be raised unless
|
|
212
|
-
you specify the `force=True` argument.
|
|
213
|
-
|
|
214
|
-
Args:
|
|
215
|
-
resource_id (str): a resource identifier
|
|
216
|
-
location (Path|str: an absolute or relative pathname
|
|
217
|
-
force (bool): force adding even if the resource_id exists
|
|
218
|
-
|
|
219
|
-
Returns:
|
|
220
|
-
ValueError if the location can not be determined.
|
|
221
|
-
"""
|
|
222
|
-
# Check if id already exists, overwrite or raise exception?
|
|
223
|
-
|
|
224
|
-
if resource_id in resources and force is False:
|
|
225
|
-
raise ValueError(f"Resource identifier '{resource_id}' already exists.")
|
|
226
|
-
|
|
227
|
-
# Check if location exists and is a directory.
|
|
228
|
-
|
|
229
|
-
location = Path(location)
|
|
230
|
-
|
|
231
|
-
if location.is_absolute() and location.is_dir():
|
|
232
|
-
resources[resource_id] = location
|
|
233
|
-
|
|
234
|
-
if not location.is_absolute():
|
|
235
|
-
location = resources_root / location
|
|
236
|
-
if location.is_dir():
|
|
237
|
-
resources[resource_id] = location
|
|
238
|
-
else:
|
|
239
|
-
raise ValueError(f"Unknown location {location=}")
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
def get_resource(resource_locator: str) -> Path:
|
|
243
|
-
"""
|
|
244
|
-
Returns the absolute Path for the given resource_locator. The resource_locator consists of
|
|
245
|
-
a resource_id, an optional wildcard and a filename separated by a forward slash '/' and
|
|
246
|
-
started by a colon ':'.
|
|
247
|
-
|
|
248
|
-
':/<resource_id>/[*/]<filename>'
|
|
249
|
-
|
|
250
|
-
If the resource_locator starts with a colon ':', the name will be interpreted as a resource_id
|
|
251
|
-
and filename combination and parsed as such
|
|
252
|
-
|
|
253
|
-
If the resource_locator doesn't start with a colon ':', then the string will be interpreted as a
|
|
254
|
-
Path name and returned if that path exists, otherwise a ResourceError is raised.
|
|
255
|
-
|
|
256
|
-
The filename can contain the wildcard '*' and/or '?', however the use of a wildcard in the
|
|
257
|
-
filename can still only match one unique filename. This can be useful e.g. if you know the
|
|
258
|
-
filename except for one part of it like a timestamp. Used, e.g., for matching Setup files which
|
|
259
|
-
are unique filenames with a timestamp.
|
|
260
|
-
|
|
261
|
-
Args:
|
|
262
|
-
resource_locator (str): a special resource name or a filename
|
|
263
|
-
|
|
264
|
-
Returns:
|
|
265
|
-
a Path with the absolute filename for the resource.
|
|
266
|
-
|
|
267
|
-
Raises:
|
|
268
|
-
ResourceError when no file could be found or the search is ambiguous.
|
|
269
|
-
|
|
270
|
-
"""
|
|
271
|
-
# Try to match the special resource syntax `:/resource_id/` or `:/resource_id/*/`
|
|
272
|
-
|
|
273
|
-
if resource_locator.startswith(':'):
|
|
274
|
-
|
|
275
|
-
if not __initialised__:
|
|
276
|
-
MODULE_LOGGER.warning("Resources have not been initialised.")
|
|
277
|
-
|
|
278
|
-
match = PATTERN.fullmatch(resource_locator)
|
|
279
|
-
resource_id = match[1]
|
|
280
|
-
filename = match[3]
|
|
281
|
-
try:
|
|
282
|
-
resource_location = Path(resources[resource_id])
|
|
283
|
-
except KeyError:
|
|
284
|
-
raise ResourceError(f"Resource not defined: {resource_id}")
|
|
285
|
-
|
|
286
|
-
# Match can be only three things
|
|
287
|
-
# - None in which case the file must be in the resource location directly
|
|
288
|
-
# - '*/' in which case the file must be in a sub-folder of the resource
|
|
289
|
-
# - '**/' to find the file in any sub-folder below the given resource
|
|
290
|
-
|
|
291
|
-
if match[2] is None:
|
|
292
|
-
if contains_wildcard(filename):
|
|
293
|
-
files = list(find_files(filename, root=resource_location))
|
|
294
|
-
|
|
295
|
-
if len(files) == 1:
|
|
296
|
-
filename = files[0]
|
|
297
|
-
elif len(files) == 0:
|
|
298
|
-
raise NoSuchFileError(f"No file found that matches {filename=} for the given "
|
|
299
|
-
f"resource '{resource_id}'.")
|
|
300
|
-
else:
|
|
301
|
-
raise AmbiguityError(f"The {filename=} found {len(files)} matches for "
|
|
302
|
-
f"the given resource '{resource_id}'.")
|
|
303
|
-
|
|
304
|
-
return check_if_file_exists(resource_location / filename, resource_id)
|
|
305
|
-
|
|
306
|
-
elif match[2] == "*/":
|
|
307
|
-
files = list(find_files(filename, root=resource_location))
|
|
308
|
-
|
|
309
|
-
if len(files) == 1:
|
|
310
|
-
return files[0]
|
|
311
|
-
elif len(files) == 0:
|
|
312
|
-
raise NoSuchFileError(
|
|
313
|
-
f"The {filename=} could not be found for the given resource '{resource_id}'."
|
|
314
|
-
)
|
|
315
|
-
else:
|
|
316
|
-
raise AmbiguityError(f"The {filename=} was found {len(files)} times for "
|
|
317
|
-
f"the given resource '{resource_id}'.")
|
|
318
|
-
elif match[2] == '**/':
|
|
319
|
-
raise NotImplementedError(f"The '**' to walk the tree is not yet implemented.")
|
|
320
|
-
else:
|
|
321
|
-
raise InternalError(
|
|
322
|
-
f"This shouldn't happen, the match is {match[2]=} for {resource_locator=}")
|
|
323
|
-
else:
|
|
324
|
-
return check_if_file_exists(Path(resource_locator))
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
initialise_resources()
|
|
328
|
-
|
|
329
|
-
if __name__ == "__main__":
|
|
330
|
-
|
|
331
|
-
import rich
|
|
332
|
-
rich.print("Default resources:")
|
|
333
|
-
rich.print(get_resource_locations())
|
egse/rst.py
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import yaml
|
|
2
|
-
import logging
|
|
3
|
-
import inspect
|
|
4
|
-
import textwrap
|
|
5
|
-
|
|
6
|
-
module_logger = logging.getLogger(__name__)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def create_args_list(cmd):
|
|
10
|
-
s = ""
|
|
11
|
-
if 'args' not in cmd:
|
|
12
|
-
return s
|
|
13
|
-
for arg_name in cmd['args'].keys():
|
|
14
|
-
s += f"{arg_name}, "
|
|
15
|
-
if 'kwargs' not in cmd:
|
|
16
|
-
return s[:-2]
|
|
17
|
-
for arg_name in cmd['kwargs'].keys():
|
|
18
|
-
s += f"{arg_name}={cmd['kwargs'][arg_name].split('|')[1].strip()}, "
|
|
19
|
-
return s[:-2]
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def handle_description(d):
|
|
23
|
-
s = textwrap.indent(inspect.cleandoc(d), " ")
|
|
24
|
-
return s + "\n\n"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def handle_args(d):
|
|
28
|
-
s = ""
|
|
29
|
-
for arg_name in d:
|
|
30
|
-
arg_type, arg_desc = [x.strip() for x in d[arg_name].split('|', 1)]
|
|
31
|
-
s += f" :param {arg_type} {arg_name}: {arg_desc}\n"
|
|
32
|
-
return s + "\n\n"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def handle_kwargs(d):
|
|
36
|
-
s = ""
|
|
37
|
-
for arg_name in d:
|
|
38
|
-
arg_type, arg_default, arg_desc = [x.strip() for x in d[arg_name].split('|', 2)]
|
|
39
|
-
s += f" :param {arg_type} {arg_name}: {arg_desc} [default: {arg_default}]"
|
|
40
|
-
return s + "\n\n"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def handle_returns(d):
|
|
44
|
-
s = ""
|
|
45
|
-
if d == "None":
|
|
46
|
-
return s
|
|
47
|
-
return_type, return_desc = [x.strip() for x in d.split('|', 2)]
|
|
48
|
-
s += f" :returns: (*{return_type}*) {return_desc}\n"
|
|
49
|
-
# s += f" :rtype: {return_type}\n"
|
|
50
|
-
return s + "\n"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def handle_todos(d):
|
|
54
|
-
return f" .. todo:: {d}\n\n"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def handle_notes(d):
|
|
58
|
-
return f" .. note:: {d}\n\n"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def handle_class_description(d):
|
|
62
|
-
s = textwrap.indent(inspect.cleandoc(d), " ")
|
|
63
|
-
return s + "\n\n"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
class RSTError(Exception):
|
|
67
|
-
pass
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
class ReStructuredText(object):
|
|
71
|
-
"""
|
|
72
|
-
.. todo:: implement proper indentation though a instance variable or something
|
|
73
|
-
.. todo:: there should also be overall class documentation loaded from the YAML file
|
|
74
|
-
"""
|
|
75
|
-
|
|
76
|
-
def __init__(self):
|
|
77
|
-
pass
|
|
78
|
-
|
|
79
|
-
def _read_yaml(self, filename):
|
|
80
|
-
with open(filename, 'r') as stream:
|
|
81
|
-
try:
|
|
82
|
-
yaml_document = yaml.load(stream)
|
|
83
|
-
except yaml.YAMLError as exc:
|
|
84
|
-
module_logger.error(exc)
|
|
85
|
-
raise RSTError(f"Error loading YAML document {filename}") from exc
|
|
86
|
-
return yaml_document
|
|
87
|
-
|
|
88
|
-
def create_auto_class_from_yaml(self, yaml_file):
|
|
89
|
-
|
|
90
|
-
yaml_document = self._read_yaml(yaml_file)
|
|
91
|
-
|
|
92
|
-
class_name = yaml_document['ProxyClass']
|
|
93
|
-
|
|
94
|
-
rst_msg = f".. class:: {class_name}\n\n"
|
|
95
|
-
|
|
96
|
-
if 'ClassDescription' in yaml_document:
|
|
97
|
-
rst_msg += handle_class_description(yaml_document['ClassDescription'])
|
|
98
|
-
|
|
99
|
-
cmd_tag = "Commands"
|
|
100
|
-
|
|
101
|
-
for cmd in yaml_document[cmd_tag]:
|
|
102
|
-
rst_msg += self.create_command(yaml_document[cmd_tag], cmd)
|
|
103
|
-
rst_msg += "\n"
|
|
104
|
-
|
|
105
|
-
return rst_msg
|
|
106
|
-
|
|
107
|
-
def create_command(self, d, cmd):
|
|
108
|
-
|
|
109
|
-
rst_msg = f" .. method:: {cmd}({create_args_list(d[cmd])})\n\n"
|
|
110
|
-
|
|
111
|
-
d = d[cmd]
|
|
112
|
-
|
|
113
|
-
if 'description' in d:
|
|
114
|
-
rst_msg += handle_description(d['description'])
|
|
115
|
-
|
|
116
|
-
if 'args' in d:
|
|
117
|
-
rst_msg += handle_args(d['args'])
|
|
118
|
-
|
|
119
|
-
if 'kwargs' in d:
|
|
120
|
-
rst_msg += handle_kwargs(d['kwargs'])
|
|
121
|
-
|
|
122
|
-
if 'returns' in d:
|
|
123
|
-
rst_msg += handle_returns(d['returns'])
|
|
124
|
-
|
|
125
|
-
if 'todo' in d:
|
|
126
|
-
rst_msg += handle_todos(d['todo'])
|
|
127
|
-
|
|
128
|
-
if 'note' in d:
|
|
129
|
-
rst_msg += handle_notes(d['note'])
|
|
130
|
-
|
|
131
|
-
return rst_msg
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if __name__ == "__main__":
|
|
135
|
-
pass
|
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
|
-
|