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
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
from egse.control import ControlServer
|
|
2
|
-
from egse.metrics import define_metrics
|
|
3
|
-
from egse.protocol import CommandProtocol
|
|
4
|
-
from egse.settings import Settings
|
|
5
|
-
from egse.setup import load_setup
|
|
6
|
-
|
|
7
|
-
from egse.shutter.thorlabs.ksc101 import ShutterKSC101Controller
|
|
8
|
-
from egse.shutter.thorlabs.ksc101 import ShutterKSC101Interface
|
|
9
|
-
from egse.shutter.thorlabs.ksc101 import ShutterKSC101Simulator
|
|
10
|
-
from egse.shutter.thorlabs.ksc101_devif import ShutterKSC101Command
|
|
11
|
-
from egse.synoptics import SynopticsManagerProxy
|
|
12
|
-
from egse.system import format_datetime
|
|
13
|
-
from egse.zmq_ser import bind_address
|
|
14
|
-
|
|
15
|
-
COMMAND_SETTINGS = Settings.load(filename="ksc101.yaml")
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class ShutterKSC101Protocol(CommandProtocol):
|
|
19
|
-
def __init__(self, control_server: ControlServer):
|
|
20
|
-
super().__init__()
|
|
21
|
-
self.control_server = control_server
|
|
22
|
-
setup = load_setup()
|
|
23
|
-
|
|
24
|
-
if Settings.simulation_mode():
|
|
25
|
-
self.shutter = ShutterKSC101Simulator()
|
|
26
|
-
else:
|
|
27
|
-
self.shutter = ShutterKSC101Controller()
|
|
28
|
-
|
|
29
|
-
self.load_commands(COMMAND_SETTINGS.Commands, ShutterKSC101Command, ShutterKSC101Interface)
|
|
30
|
-
|
|
31
|
-
self.build_device_method_lookup_table(self.shutter)
|
|
32
|
-
|
|
33
|
-
self.synoptics = SynopticsManagerProxy()
|
|
34
|
-
self.metrics = define_metrics("KSC101", setup=setup)
|
|
35
|
-
|
|
36
|
-
def get_bind_address(self):
|
|
37
|
-
return bind_address(
|
|
38
|
-
self.control_server.get_communication_protocol(),
|
|
39
|
-
self.control_server.get_commanding_port(),
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
def get_status(self):
|
|
43
|
-
return super().get_status()
|
|
44
|
-
|
|
45
|
-
def get_housekeeping(self) -> dict:
|
|
46
|
-
|
|
47
|
-
result = dict()
|
|
48
|
-
result["timestamp"] = format_datetime()
|
|
49
|
-
|
|
50
|
-
_enable = self.shutter.get_enable()
|
|
51
|
-
_mode = self.shutter.get_mode()
|
|
52
|
-
_cycles = self.shutter.get_cycle()
|
|
53
|
-
|
|
54
|
-
_parameters = list()
|
|
55
|
-
for v in _cycles.values():
|
|
56
|
-
_parameters.append(v)
|
|
57
|
-
|
|
58
|
-
_status = [_enable, _mode, _cycles, _parameters[0], _parameters[1], _parameters[2]]
|
|
59
|
-
|
|
60
|
-
for idx, key in enumerate(["GIAS_KSC101_ENABLE", "GIAS_KSC101_MODE", "GIAS_KSC101_CYCLE_CONFIG"]):
|
|
61
|
-
result[key] = _status[idx]
|
|
62
|
-
|
|
63
|
-
for key, value in result.items():
|
|
64
|
-
if key != "timestamp" and key != "GIAS_KSC101_CYCLE_CONFIG":
|
|
65
|
-
# TODO Prometheus doesn't seem to be able to deal with dictionaries (GIAS_KSC101_CYCLE_CONFIG)
|
|
66
|
-
self.metrics[key].set(value)
|
|
67
|
-
|
|
68
|
-
self.synoptics.store_th_synoptics(result)
|
|
69
|
-
|
|
70
|
-
return result
|
|
71
|
-
|
|
@@ -1,548 +0,0 @@
|
|
|
1
|
-
import argparse
|
|
2
|
-
import logging
|
|
3
|
-
import sys
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
import pyqtgraph as pg
|
|
6
|
-
import numpy as np
|
|
7
|
-
|
|
8
|
-
from PyQt5.QtWidgets import (QApplication, QMainWindow, QAction, QFrame,
|
|
9
|
-
QVBoxLayout, QHBoxLayout, QGroupBox, QLabel, QSpinBox, QToolButton, QRadioButton,
|
|
10
|
-
QMessageBox)
|
|
11
|
-
from PyQt5.QtCore import Qt, QTimer, QLockFile
|
|
12
|
-
from PyQt5.QtGui import QIcon, QPixmap, QPalette, QFont
|
|
13
|
-
from QLed import QLed
|
|
14
|
-
|
|
15
|
-
from egse.resource import get_resource
|
|
16
|
-
from egse.settings import Settings
|
|
17
|
-
from egse.observer import Observer
|
|
18
|
-
from egse.observer import Observable
|
|
19
|
-
from egse.state import UnknownStateError
|
|
20
|
-
from egse.config import find_file, set_logger_levels
|
|
21
|
-
|
|
22
|
-
from egse.shutter.thorlabs.ksc101 import ShutterKSC101Proxy, ShutterKSC101Controller, ShutterKSC101Simulator
|
|
23
|
-
from egse.gui import show_warning_message
|
|
24
|
-
|
|
25
|
-
from egse.process import ProcessStatus
|
|
26
|
-
from egse.system import do_every
|
|
27
|
-
|
|
28
|
-
from prometheus_client import Gauge, Summary
|
|
29
|
-
from prometheus_client import start_http_server
|
|
30
|
-
|
|
31
|
-
import threading
|
|
32
|
-
|
|
33
|
-
MODULE_LOGGER = logging.getLogger(__name__)
|
|
34
|
-
SETTINGS = Settings.load("Shutter KSC101 Controller")
|
|
35
|
-
GUI_SETTINGS = Settings.load("KSC101 GUI")
|
|
36
|
-
FONT = QFont("Helvetica", 18)
|
|
37
|
-
|
|
38
|
-
logger_levels = [
|
|
39
|
-
("egse.protocol", logging.INFO),
|
|
40
|
-
("egse.command", logging.INFO),
|
|
41
|
-
("egse.settings", logging.INFO),
|
|
42
|
-
("egse.config", logging.INFO),
|
|
43
|
-
("git.cmd", logging.INFO),
|
|
44
|
-
]
|
|
45
|
-
|
|
46
|
-
set_logger_levels(logger_levels)
|
|
47
|
-
|
|
48
|
-
class ShutterUIView(QMainWindow, Observable):
|
|
49
|
-
# TODO: on reconnect new values need to be updated
|
|
50
|
-
# TODO: get enable states for interlock and alarm (see ATPServer Help File)
|
|
51
|
-
# TODO: update values enable value when after a "single" or an "automatic" operation
|
|
52
|
-
|
|
53
|
-
def __init__(self):
|
|
54
|
-
super().__init__()
|
|
55
|
-
|
|
56
|
-
# Define those variables that we will need/use in different methods
|
|
57
|
-
|
|
58
|
-
self.state = None
|
|
59
|
-
self.clear_action = None
|
|
60
|
-
self.reconnect_action = None
|
|
61
|
-
self.toolbar = None
|
|
62
|
-
|
|
63
|
-
self.setGeometry(0, 0, 300, 500)
|
|
64
|
-
self.setWindowTitle('Thorlabs Shutter KSC101 Controller')
|
|
65
|
-
|
|
66
|
-
self.init_gui()
|
|
67
|
-
|
|
68
|
-
def createToolbar(self):
|
|
69
|
-
image_location = Path(__file__).resolve().parent.parent.parent / "images"
|
|
70
|
-
|
|
71
|
-
# The Reconnect action is used to reconnect the device or control server
|
|
72
|
-
|
|
73
|
-
connected_pix = QPixmap(str(image_location / "connected-100.png"))
|
|
74
|
-
disconnected_pix = QPixmap(str(image_location / "disconnected-100.png"))
|
|
75
|
-
reconnect_icon = QIcon()
|
|
76
|
-
reconnect_icon.addPixmap(connected_pix, QIcon.Normal, QIcon.On)
|
|
77
|
-
reconnect_icon.addPixmap(disconnected_pix, QIcon.Normal, QIcon.Off)
|
|
78
|
-
|
|
79
|
-
self.reconnect_action = QAction(reconnect_icon, 'Reconnect', self)
|
|
80
|
-
self.reconnect_action.setToolTip("Reconnect")
|
|
81
|
-
self.reconnect_action.setCheckable(True)
|
|
82
|
-
self.reconnect_action.triggered.connect(self.onClick)
|
|
83
|
-
|
|
84
|
-
self.enable = QToolButton()
|
|
85
|
-
self.enable.setArrowType(Qt.RightArrow)
|
|
86
|
-
self.enable.clicked.connect(self.set_enable)
|
|
87
|
-
self.enable.setToolTip("Enable Solenoid")
|
|
88
|
-
|
|
89
|
-
self.toolbar = self.addToolBar('MainToolbar')
|
|
90
|
-
self.toolbar.addAction(self.reconnect_action)
|
|
91
|
-
self.toolbar.addWidget(self.enable)
|
|
92
|
-
|
|
93
|
-
return self.toolbar
|
|
94
|
-
|
|
95
|
-
def createStatesWidget(self):
|
|
96
|
-
|
|
97
|
-
self.states = [
|
|
98
|
-
[QLabel("Shutter alarm"), QLed(self, offColour = QLed.Green, onColour = QLed.Red), QLed.setBaseSize(self, 1, 1)],
|
|
99
|
-
[QLabel("Interlock alarm"), QLed(self, offColour = QLed.Green, onColour = QLed.Red)],
|
|
100
|
-
[QLabel("Enable"), QLed(self, offColour = QLed.Red, onColour = QLed.Green)],
|
|
101
|
-
]
|
|
102
|
-
|
|
103
|
-
vbox = QVBoxLayout()
|
|
104
|
-
|
|
105
|
-
for state in self.states:
|
|
106
|
-
hbox = QHBoxLayout()
|
|
107
|
-
hbox.addWidget(state[1])
|
|
108
|
-
hbox.addWidget(state[0])
|
|
109
|
-
state[1].setFixedSize(20, 20)
|
|
110
|
-
hbox.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
|
111
|
-
hbox.setSpacing(5)
|
|
112
|
-
vbox.addLayout(hbox)
|
|
113
|
-
|
|
114
|
-
vbox.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
|
115
|
-
vbox.setSpacing(0)
|
|
116
|
-
|
|
117
|
-
group_box = QGroupBox("Shutter State",self)
|
|
118
|
-
|
|
119
|
-
group_box.setLayout(vbox)
|
|
120
|
-
|
|
121
|
-
return group_box
|
|
122
|
-
|
|
123
|
-
def createOperationWidget(self):
|
|
124
|
-
|
|
125
|
-
hbox = QHBoxLayout()
|
|
126
|
-
|
|
127
|
-
group_mode = QGroupBox("Control Mode", self)
|
|
128
|
-
vbox = QVBoxLayout()
|
|
129
|
-
|
|
130
|
-
self.operation_modes = [[QRadioButton("Manual")],
|
|
131
|
-
[QRadioButton("Single")],
|
|
132
|
-
[QRadioButton("Auto")],
|
|
133
|
-
[QRadioButton("Trigger")]
|
|
134
|
-
]
|
|
135
|
-
|
|
136
|
-
for mode in self.operation_modes:
|
|
137
|
-
mode[0].clicked.connect(self.set_mode)
|
|
138
|
-
vbox.addWidget(mode[0])
|
|
139
|
-
|
|
140
|
-
vbox.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
|
141
|
-
vbox.setSpacing(10)
|
|
142
|
-
|
|
143
|
-
group_mode.setLayout(vbox)
|
|
144
|
-
|
|
145
|
-
group_cycle = QGroupBox("Cycling Settings", self)
|
|
146
|
-
vbox_cycle = QVBoxLayout()
|
|
147
|
-
|
|
148
|
-
self.cycle = [
|
|
149
|
-
[QLabel("ON duration (ms):"), QSpinBox(), "ON", 100, 100000],
|
|
150
|
-
[QLabel("OFF duration (ms):"), QSpinBox(), "OFF", 100, 100000],
|
|
151
|
-
[QLabel("Number of cycles:"), QSpinBox(), "Number", 0, 100000]
|
|
152
|
-
]
|
|
153
|
-
|
|
154
|
-
for options in self.cycle:
|
|
155
|
-
hbox_cycle = QHBoxLayout()
|
|
156
|
-
hbox_cycle.addWidget(options[0])
|
|
157
|
-
#hbox_cycle.addStretch(2) --> Not needed if fixed width is set
|
|
158
|
-
hbox_cycle.addWidget(options[1])
|
|
159
|
-
options[1].setObjectName(options[2])
|
|
160
|
-
options[1].setMinimum(options[3])
|
|
161
|
-
options[1].setMaximum(options[4])
|
|
162
|
-
options[1].valueChanged.connect(self.set_cycle)
|
|
163
|
-
options[1].setFixedWidth(100)
|
|
164
|
-
options[0].setFixedWidth(120)
|
|
165
|
-
hbox_cycle.setAlignment(Qt.AlignLeft | Qt.AlignTop)
|
|
166
|
-
vbox_cycle.addLayout(hbox_cycle)
|
|
167
|
-
vbox_cycle.setSpacing(10)
|
|
168
|
-
|
|
169
|
-
vbox_cycle.addStretch()
|
|
170
|
-
group_cycle.setLayout(vbox_cycle)
|
|
171
|
-
|
|
172
|
-
hbox.addWidget(group_mode)
|
|
173
|
-
hbox.addWidget(group_cycle)
|
|
174
|
-
|
|
175
|
-
group_operation = QGroupBox("Shutter operations", self)
|
|
176
|
-
group_operation.setLayout(hbox)
|
|
177
|
-
|
|
178
|
-
return group_operation
|
|
179
|
-
|
|
180
|
-
def init_gui(self):
|
|
181
|
-
|
|
182
|
-
## Switch to using white background and black foreground for pyqtgraph stripcharts
|
|
183
|
-
|
|
184
|
-
pg.setConfigOption('background', 'w')
|
|
185
|
-
pg.setConfigOption('foreground', 'k')
|
|
186
|
-
|
|
187
|
-
# The main frame in which all the other frames are located, the outer Application frame
|
|
188
|
-
|
|
189
|
-
app_frame = QFrame()
|
|
190
|
-
app_frame.setObjectName("AppFrame")
|
|
191
|
-
|
|
192
|
-
create_state = self.createStatesWidget()
|
|
193
|
-
create_operation = self.createOperationWidget()
|
|
194
|
-
|
|
195
|
-
hbox = QHBoxLayout()
|
|
196
|
-
toolbar_widget = self.createToolbar()
|
|
197
|
-
hbox.addWidget(create_state)
|
|
198
|
-
hbox.addWidget(create_operation)
|
|
199
|
-
|
|
200
|
-
app_frame.setLayout(hbox)
|
|
201
|
-
|
|
202
|
-
self.setCentralWidget(app_frame)
|
|
203
|
-
|
|
204
|
-
def set_style(self):
|
|
205
|
-
"""
|
|
206
|
-
Set the style for the Shutter Widget when it is connected to a real
|
|
207
|
-
Shutter Controller (hardware).
|
|
208
|
-
This will override the styles that were defined in the styles.qss style file
|
|
209
|
-
that was loaded for the Application.
|
|
210
|
-
"""
|
|
211
|
-
self.setAutoFillBackground(True)
|
|
212
|
-
self.setBackgroundRole(QPalette.Light)
|
|
213
|
-
self.setStyleSheet("""
|
|
214
|
-
QGroupBox {
|
|
215
|
-
border: 1px solid lightGray;
|
|
216
|
-
border-radius: 0px;
|
|
217
|
-
margin-top: 0px;
|
|
218
|
-
padding-top: 10px;
|
|
219
|
-
}
|
|
220
|
-
QGroupBox::title {
|
|
221
|
-
background-color: transparent;
|
|
222
|
-
padding-top: 0px;
|
|
223
|
-
padding-left: 0px;
|
|
224
|
-
}
|
|
225
|
-
""")
|
|
226
|
-
|
|
227
|
-
def set_style_simulator(self):
|
|
228
|
-
"""
|
|
229
|
-
Set the style for the Shutter UI Widget when it is connected to a
|
|
230
|
-
Shutter Simulator.
|
|
231
|
-
This will override the styles that were defined in the styles.qss style file
|
|
232
|
-
that was loaded for the Application.
|
|
233
|
-
"""
|
|
234
|
-
self.setAutoFillBackground(True)
|
|
235
|
-
self.setBackgroundRole(QPalette.Dark)
|
|
236
|
-
self.setStyleSheet("""
|
|
237
|
-
QGroupBox {
|
|
238
|
-
border: 1px solid lightGray;
|
|
239
|
-
border-radius: 0px;
|
|
240
|
-
margin-top: 0px;
|
|
241
|
-
padding-top: 10px;
|
|
242
|
-
}
|
|
243
|
-
QGroupBox::title {
|
|
244
|
-
background-color: transparent;
|
|
245
|
-
padding-top: 0px;
|
|
246
|
-
padding-left: 0px;
|
|
247
|
-
}
|
|
248
|
-
""")
|
|
249
|
-
|
|
250
|
-
def initialize_values(self, configuration):
|
|
251
|
-
"gets the parameter values on shutter start up"
|
|
252
|
-
_cycle = configuration["cycle"]
|
|
253
|
-
_cycle = list(_cycle.values())
|
|
254
|
-
|
|
255
|
-
for parameter in range(len(self.cycle)):
|
|
256
|
-
self.cycle[parameter][1].blockSignals(True) #avoids to trigger an event on init
|
|
257
|
-
self.cycle[parameter][1].setValue(_cycle[parameter])
|
|
258
|
-
self.cycle[parameter][1].blockSignals(False)
|
|
259
|
-
|
|
260
|
-
_mode = configuration["mode"] - 1
|
|
261
|
-
self.operation_modes[_mode][0].blockSignals(True)
|
|
262
|
-
self.operation_modes[_mode][0].setChecked(True)
|
|
263
|
-
self.operation_modes[_mode][0].blockSignals(False)
|
|
264
|
-
|
|
265
|
-
_state = [False, False, configuration["state"]]
|
|
266
|
-
|
|
267
|
-
for state in range(len(self.states)):
|
|
268
|
-
self.states[state][1].blockSignals(True)
|
|
269
|
-
self.states[state][1].setValue(_state[state])
|
|
270
|
-
self.states[state][1].blockSignals(False)
|
|
271
|
-
|
|
272
|
-
def onClick(self):
|
|
273
|
-
|
|
274
|
-
sender = self.sender()
|
|
275
|
-
|
|
276
|
-
MODULE_LOGGER.debug(f"sender.text() = {sender.text()}")
|
|
277
|
-
MODULE_LOGGER.debug(f"sender.isChecked() = {sender.isChecked()}")
|
|
278
|
-
|
|
279
|
-
self.notifyObservers(sender)
|
|
280
|
-
|
|
281
|
-
def set_cycle(self):
|
|
282
|
-
cycle =[]
|
|
283
|
-
for parameter in range(len(self.cycle)):
|
|
284
|
-
cycle.append(self.cycle[parameter][1].value())
|
|
285
|
-
self.actionObservers({'set_cycle': cycle})
|
|
286
|
-
|
|
287
|
-
def set_mode(self):
|
|
288
|
-
_mode=[]
|
|
289
|
-
op_modes = ["manual", "single", "auto", "trigger"]
|
|
290
|
-
for mode in range(len(self.operation_modes)):
|
|
291
|
-
_mode.append(self.operation_modes[mode][0].isChecked())
|
|
292
|
-
self.actionObservers({'set_mode': op_modes[int(np.where(_mode)[0])]})
|
|
293
|
-
|
|
294
|
-
def set_enable(self):
|
|
295
|
-
self.actionObservers({'set_enable': not self.states[2][1].value})
|
|
296
|
-
|
|
297
|
-
def set_connection_state(self, state):
|
|
298
|
-
|
|
299
|
-
if state == 'connected':
|
|
300
|
-
self.reconnect_action.setChecked(True)
|
|
301
|
-
elif state == 'disconnected':
|
|
302
|
-
self.reconnect_action.setChecked(False)
|
|
303
|
-
else:
|
|
304
|
-
raise UnknownStateError(
|
|
305
|
-
f"Unknown State ({state}), expected 'connected' or 'disconnected'.")
|
|
306
|
-
|
|
307
|
-
class ShutterUIModel:
|
|
308
|
-
def __init__(self, type_):
|
|
309
|
-
self.type = type_
|
|
310
|
-
|
|
311
|
-
if self.type == "proxy":
|
|
312
|
-
self.sht = ShutterKSC101Proxy()
|
|
313
|
-
elif self.type == "direct":
|
|
314
|
-
self.sht = ShutterKSC101Controller()
|
|
315
|
-
self.sht.connect()
|
|
316
|
-
elif self.type == "simulator":
|
|
317
|
-
self.sht = ShutterKSC101Simulator()
|
|
318
|
-
else:
|
|
319
|
-
raise Exception(f"Unknown type of Shutter implementation passed into the model: {type}")
|
|
320
|
-
|
|
321
|
-
if self.sht is not None:
|
|
322
|
-
MODULE_LOGGER.debug(f"ShutterKSC101Controller initialized as {self.sht.__class__.__name__}")
|
|
323
|
-
|
|
324
|
-
def has_commands(self):
|
|
325
|
-
if self.type == "proxy":
|
|
326
|
-
return self.sht.has_commands()
|
|
327
|
-
return True
|
|
328
|
-
|
|
329
|
-
def load_commands(self):
|
|
330
|
-
if self.type == "proxy":
|
|
331
|
-
self.sht.load_commands()
|
|
332
|
-
|
|
333
|
-
def is_simulator(self):
|
|
334
|
-
return self.sht.is_simulator()
|
|
335
|
-
|
|
336
|
-
def is_connected(self):
|
|
337
|
-
if self.type == "proxy":
|
|
338
|
-
return self.sht.is_cs_connected()
|
|
339
|
-
else:
|
|
340
|
-
return self.sht.is_connected()
|
|
341
|
-
|
|
342
|
-
def reconnect(self):
|
|
343
|
-
if self.type == "proxy":
|
|
344
|
-
self.sht.reconnect_cs()
|
|
345
|
-
return self.sht.is_cs_connected()
|
|
346
|
-
else:
|
|
347
|
-
self.sht.reconnect()
|
|
348
|
-
return self.sht.is_connected()
|
|
349
|
-
return False
|
|
350
|
-
|
|
351
|
-
def disconnect(self):
|
|
352
|
-
if self.type == "proxy":
|
|
353
|
-
self.sht.disconnect_cs()
|
|
354
|
-
else:
|
|
355
|
-
self.sht.disconnect()
|
|
356
|
-
|
|
357
|
-
def set_mode(self, mode):
|
|
358
|
-
self.sht.set_mode(mode = mode)
|
|
359
|
-
|
|
360
|
-
def set_cycle(self, on, off, number):
|
|
361
|
-
self.sht.set_cycle(on, off, number)
|
|
362
|
-
|
|
363
|
-
def set_enable(self, status):
|
|
364
|
-
self.sht.set_enable(status)
|
|
365
|
-
|
|
366
|
-
def get_configuration(self):
|
|
367
|
-
cycle = self.sht.get_cycle()
|
|
368
|
-
mode = self.sht.get_mode()
|
|
369
|
-
state = self.sht.get_enable()
|
|
370
|
-
configuration = {"cycle": cycle, "mode": mode, "state": state}
|
|
371
|
-
return configuration
|
|
372
|
-
|
|
373
|
-
class ShutterUIController(Observer):
|
|
374
|
-
def __init__(self, model, view):
|
|
375
|
-
self.model = model
|
|
376
|
-
self.view = view
|
|
377
|
-
self.view.addObserver(self)
|
|
378
|
-
|
|
379
|
-
self.create_timer()
|
|
380
|
-
|
|
381
|
-
if self.model.is_connected():
|
|
382
|
-
self.initialize_values()
|
|
383
|
-
|
|
384
|
-
if self.model.is_simulator():
|
|
385
|
-
self.view.set_style_simulator()
|
|
386
|
-
else:
|
|
387
|
-
self.view.set_style()
|
|
388
|
-
|
|
389
|
-
self.view.set_connection_state('connected')
|
|
390
|
-
self.start_timer()
|
|
391
|
-
else:
|
|
392
|
-
self.stop_timer()
|
|
393
|
-
self.view.set_connection_state('disconnected')
|
|
394
|
-
|
|
395
|
-
def create_timer(self):
|
|
396
|
-
"""Create a Timer that will update the States every second."""
|
|
397
|
-
|
|
398
|
-
self.states_capture_timer = QTimer()
|
|
399
|
-
# This is only needed when the Timer needs to run in another Thread
|
|
400
|
-
# self.states_capture_timer.moveToThread(self)
|
|
401
|
-
self.states_capture_timer.setInterval(200)
|
|
402
|
-
self.states_capture_timer.timeout.connect(self.initialize_values)
|
|
403
|
-
|
|
404
|
-
self.stripchart_timer = QTimer()
|
|
405
|
-
# self.stripchart_timer.timeout.connect(self.update_stripchart)
|
|
406
|
-
self.stripchart_timer.setInterval(200)
|
|
407
|
-
|
|
408
|
-
def start_timer(self):
|
|
409
|
-
self.states_capture_timer.start()
|
|
410
|
-
self.stripchart_timer.start()
|
|
411
|
-
|
|
412
|
-
def stop_timer(self):
|
|
413
|
-
self.states_capture_timer.stop()
|
|
414
|
-
self.stripchart_timer.stop()
|
|
415
|
-
|
|
416
|
-
def initialize_values(self):
|
|
417
|
-
configuration = self.model.get_configuration()
|
|
418
|
-
self.view.initialize_values(configuration)
|
|
419
|
-
|
|
420
|
-
def update(self, changed_object):
|
|
421
|
-
|
|
422
|
-
text = changed_object.text()
|
|
423
|
-
|
|
424
|
-
if text == "Reconnect":
|
|
425
|
-
if changed_object.isChecked():
|
|
426
|
-
MODULE_LOGGER.debug("Reconnecting the Shutter KSC101 model.")
|
|
427
|
-
if self.model.reconnect():
|
|
428
|
-
self.view.set_connection_state('connected')
|
|
429
|
-
if not self.model.has_commands():
|
|
430
|
-
self.model.load_commands()
|
|
431
|
-
self.start_timer()
|
|
432
|
-
else:
|
|
433
|
-
self.view.reconnect_action.setChecked(False)
|
|
434
|
-
else:
|
|
435
|
-
MODULE_LOGGER.debug("Disconnecting the Shutter KSC101 model.")
|
|
436
|
-
self.stop_timer()
|
|
437
|
-
self.model.disconnect()
|
|
438
|
-
self.view.set_connection_state('disconnected')
|
|
439
|
-
|
|
440
|
-
return
|
|
441
|
-
|
|
442
|
-
if text == "ClearErrors":
|
|
443
|
-
self.model.clearError()
|
|
444
|
-
|
|
445
|
-
if text == "Reset":
|
|
446
|
-
pass
|
|
447
|
-
|
|
448
|
-
def do(self, actions):
|
|
449
|
-
|
|
450
|
-
for action, value in actions.items():
|
|
451
|
-
MODULE_LOGGER.debug(f"do {action} with {value}")
|
|
452
|
-
if action == "set_mode":
|
|
453
|
-
mode = value
|
|
454
|
-
MODULE_LOGGER.debug(f"do: set_mode({mode}:{type(mode)})")
|
|
455
|
-
self.model.set_mode(mode)
|
|
456
|
-
self.initialize_values()
|
|
457
|
-
|
|
458
|
-
if action == "set_cycle":
|
|
459
|
-
on, off, number = value
|
|
460
|
-
MODULE_LOGGER.debug(f"do: set_mode({on}:{type(on)}, {off}:{type(off)}, {number}:{type(number)})")
|
|
461
|
-
self.model.set_cycle(on, off, number)
|
|
462
|
-
self.initialize_values()
|
|
463
|
-
|
|
464
|
-
if action == "set_enable":
|
|
465
|
-
status = value
|
|
466
|
-
MODULE_LOGGER.debug(f"do: set_enable({status}:{type(status)})")
|
|
467
|
-
self.model.set_enable(status)
|
|
468
|
-
self.initialize_values()
|
|
469
|
-
|
|
470
|
-
def parse_arguments():
|
|
471
|
-
"""
|
|
472
|
-
Prepare the arguments that are specific for this application.
|
|
473
|
-
"""
|
|
474
|
-
parser = argparse.ArgumentParser()
|
|
475
|
-
parser.add_argument(
|
|
476
|
-
"--type",
|
|
477
|
-
dest="type",
|
|
478
|
-
action="store",
|
|
479
|
-
choices={"proxy", "simulator", "direct"},
|
|
480
|
-
help="Specify the implementation you want to connect to.",
|
|
481
|
-
default="proxy",
|
|
482
|
-
)
|
|
483
|
-
parser.add_argument(
|
|
484
|
-
"--profile",
|
|
485
|
-
default=False,
|
|
486
|
-
action="store_true",
|
|
487
|
-
help="Enable info logging messages with method profile information.",
|
|
488
|
-
)
|
|
489
|
-
args = parser.parse_args()
|
|
490
|
-
return args
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
def main():
|
|
494
|
-
lock_file = QLockFile(str(Path("~/ksc101_ui.app.lock").expanduser()))
|
|
495
|
-
|
|
496
|
-
STYLES_LOCATION = find_file("styles.qss", in_dir="egse/gui")
|
|
497
|
-
|
|
498
|
-
args = list(sys.argv)
|
|
499
|
-
args[1:1] = ["-stylesheet", str(STYLES_LOCATION)]
|
|
500
|
-
app = QApplication(args)
|
|
501
|
-
app.setWindowIcon(QIcon(str(get_resource(":/icons/shutter.svg"))))
|
|
502
|
-
|
|
503
|
-
if lock_file.tryLock(100):
|
|
504
|
-
process_status = ProcessStatus()
|
|
505
|
-
|
|
506
|
-
timer_thread = threading.Thread(target=do_every, args=(10, process_status.update))
|
|
507
|
-
timer_thread.daemon = True
|
|
508
|
-
timer_thread.start()
|
|
509
|
-
|
|
510
|
-
start_http_server(GUI_SETTINGS.METRICS_PORT)
|
|
511
|
-
|
|
512
|
-
args = parse_arguments()
|
|
513
|
-
|
|
514
|
-
if args.profile:
|
|
515
|
-
Settings.set_profiling(True)
|
|
516
|
-
|
|
517
|
-
if args.type == "proxy":
|
|
518
|
-
proxy = ShutterKSC101Proxy()
|
|
519
|
-
if not proxy.ping():
|
|
520
|
-
description = "Could not connect to Shutter Control Server"
|
|
521
|
-
info_text = (
|
|
522
|
-
"The GUI will start, but the connection button will show a disconnected state. "
|
|
523
|
-
"Please check if the Control Server is running and start the server if needed. "
|
|
524
|
-
"Otherwise, check if the correct HOSTNAME for the control server is set in the "
|
|
525
|
-
"Settings.yaml "
|
|
526
|
-
"configuration file."
|
|
527
|
-
)
|
|
528
|
-
|
|
529
|
-
show_warning_message(description, info_text)
|
|
530
|
-
|
|
531
|
-
view = ShutterUIView()
|
|
532
|
-
model = ShutterUIModel(args.type)
|
|
533
|
-
controller = ShutterUIController(model, view)
|
|
534
|
-
|
|
535
|
-
view.show()
|
|
536
|
-
return app.exec_()
|
|
537
|
-
else:
|
|
538
|
-
error_message = QMessageBox()
|
|
539
|
-
error_message.setIcon(QMessageBox.Warning)
|
|
540
|
-
error_message.setWindowTitle("Error")
|
|
541
|
-
error_message.setText("The KSC101 GUI application is already running!")
|
|
542
|
-
error_message.setStandardButtons(QMessageBox.Ok)
|
|
543
|
-
|
|
544
|
-
return error_message.exec()
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
if __name__ == "__main__":
|
|
548
|
-
sys.exit(main())
|
egse/shutter/thorlabs/sc10.py
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
|
|
3
|
-
from prometheus_client import Gauge
|
|
4
|
-
|
|
5
|
-
from egse.control import ControlServer
|
|
6
|
-
from egse.command import ClientServerCommand
|
|
7
|
-
from egse.protocol import CommandProtocol
|
|
8
|
-
from egse.proxy import Proxy
|
|
9
|
-
from egse.settings import Settings
|
|
10
|
-
from egse.synoptics import SynopticsManagerProxy
|
|
11
|
-
from egse.zmq_ser import bind_address
|
|
12
|
-
from egse.system import format_datetime
|
|
13
|
-
from egse.shutter.thorlabs.sc10_interface import Sc10Interface
|
|
14
|
-
from egse.shutter.thorlabs.sc10_controller import Sc10Controller
|
|
15
|
-
from egse.shutter.thorlabs.sc10_simulator import Sc10Simulator
|
|
16
|
-
from egse.zmq_ser import connect_address
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
LOGGER = logging.getLogger(__name__)
|
|
20
|
-
|
|
21
|
-
DEVICE_SETTINGS = Settings.load(filename="sc10.yaml")
|
|
22
|
-
CTRL_SETTINGS = Settings.load("Thorlabs SC10 Control Server")
|
|
23
|
-
|
|
24
|
-
SITE_ID = Settings.load("SITE").ID
|
|
25
|
-
|
|
26
|
-
gauge_enable = Gauge(f'G{SITE_ID}_SC10_ENABLE', '')
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class Sc10Command(ClientServerCommand):
|
|
30
|
-
pass
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class Sc10Protocol(CommandProtocol):
|
|
34
|
-
|
|
35
|
-
def __init__(self, control_server: ControlServer):
|
|
36
|
-
|
|
37
|
-
super().__init__()
|
|
38
|
-
self.control_server = control_server
|
|
39
|
-
|
|
40
|
-
if Settings.simulation_mode():
|
|
41
|
-
self.dev = Sc10Simulator()
|
|
42
|
-
else:
|
|
43
|
-
self.dev = Sc10Controller()
|
|
44
|
-
|
|
45
|
-
self.load_commands(DEVICE_SETTINGS.Commands, Sc10Command, Sc10Interface)
|
|
46
|
-
self.build_device_method_lookup_table(self.dev)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
# move to parent class?
|
|
50
|
-
def get_bind_address(self):
|
|
51
|
-
return bind_address(
|
|
52
|
-
self.control_server.get_communication_protocol(),
|
|
53
|
-
self.control_server.get_commanding_port(),
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def get_status(self):
|
|
58
|
-
status_dict = super().get_status()
|
|
59
|
-
status_dict['shutter_state'] = self.dev.get_enable()
|
|
60
|
-
return status_dict
|
|
61
|
-
|
|
62
|
-
def get_housekeeping(self) -> dict:
|
|
63
|
-
|
|
64
|
-
result = dict()
|
|
65
|
-
result["timestamp"] = format_datetime()
|
|
66
|
-
|
|
67
|
-
result[f"G{SITE_ID}_SC10_ENABLE"] = self.dev.get_enable()
|
|
68
|
-
|
|
69
|
-
with SynopticsManagerProxy() as synoptics:
|
|
70
|
-
synoptics.store_th_synoptics(result)
|
|
71
|
-
|
|
72
|
-
gauge_enable.set(result[f"G{SITE_ID}_SC10_ENABLE"])
|
|
73
|
-
|
|
74
|
-
return result
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
class Sc10Proxy(Proxy, Sc10Interface):
|
|
78
|
-
|
|
79
|
-
def __init__(self):
|
|
80
|
-
super().__init__(
|
|
81
|
-
connect_address(
|
|
82
|
-
CTRL_SETTINGS.PROTOCOL, CTRL_SETTINGS.HOSTNAME, CTRL_SETTINGS.COMMANDING_PORT))
|