cgse 2024.7.0__py3-none-any.whl → 2025.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- README.md +27 -0
- bump.py +85 -0
- cgse-2025.0.2.dist-info/METADATA +38 -0
- cgse-2025.0.2.dist-info/RECORD +5 -0
- {cgse-2024.7.0.dist-info → cgse-2025.0.2.dist-info}/WHEEL +1 -2
- cgse-2024.7.0.dist-info/COPYING +0 -674
- cgse-2024.7.0.dist-info/COPYING.LESSER +0 -165
- cgse-2024.7.0.dist-info/METADATA +0 -144
- cgse-2024.7.0.dist-info/RECORD +0 -660
- cgse-2024.7.0.dist-info/entry_points.txt +0 -75
- cgse-2024.7.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5238
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -627
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -903
- egse/aeu/aeu_metrics.py +0 -131
- egse/aeu/aeu_protocol.py +0 -463
- egse/aeu/aeu_psu.yaml +0 -204
- egse/aeu/aeu_ui.py +0 -873
- egse/aeu/arbdata/FccdRead.arb +0 -2
- egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
- egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/ccdRead25.arb +0 -2
- egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead50.arb +0 -2
- egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
- egse/alert/__init__.py +0 -1049
- egse/alert/alertman.yaml +0 -37
- egse/alert/alertman_cs.py +0 -233
- egse/alert/alertman_ui.py +0 -600
- egse/alert/gsm/beaglebone.py +0 -138
- egse/alert/gsm/beaglebone.yaml +0 -51
- egse/alert/gsm/beaglebone_cs.py +0 -108
- egse/alert/gsm/beaglebone_devif.py +0 -122
- egse/alert/gsm/beaglebone_protocol.py +0 -46
- egse/bits.py +0 -318
- egse/camera.py +0 -44
- egse/collimator/__init__.py +0 -0
- egse/collimator/fcul/__init__.py +0 -0
- egse/collimator/fcul/ogse.py +0 -1077
- egse/collimator/fcul/ogse.yaml +0 -14
- egse/collimator/fcul/ogse_cs.py +0 -154
- egse/collimator/fcul/ogse_devif.py +0 -358
- egse/collimator/fcul/ogse_protocol.py +0 -132
- egse/collimator/fcul/ogse_sim.py +0 -431
- egse/collimator/fcul/ogse_ui.py +0 -1108
- egse/command.py +0 -699
- egse/config.py +0 -410
- egse/confman/__init__.py +0 -1058
- egse/confman/confman.yaml +0 -70
- egse/confman/confman_cs.py +0 -240
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -632
- egse/coordinates/__init__.py +0 -534
- egse/coordinates/avoidance.py +0 -100
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -122
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -194
- egse/coordinates/referenceFrame.py +0 -1279
- egse/coordinates/refmodel.py +0 -737
- egse/coordinates/rotationMatrix.py +0 -85
- egse/coordinates/transform3d_addon.py +0 -419
- egse/csl/__init__.py +0 -50
- egse/csl/commanding.py +0 -78
- egse/csl/icons/hexapod-connected-selected.svg +0 -30
- egse/csl/icons/hexapod-connected.svg +0 -30
- egse/csl/icons/hexapod-homing-selected.svg +0 -68
- egse/csl/icons/hexapod-homing.svg +0 -68
- egse/csl/icons/hexapod-retract-selected.svg +0 -56
- egse/csl/icons/hexapod-retract.svg +0 -51
- egse/csl/icons/hexapod-zero-selected.svg +0 -56
- egse/csl/icons/hexapod-zero.svg +0 -56
- egse/csl/icons/logo-puna.svg +0 -92
- egse/csl/icons/stop.svg +0 -1
- egse/csl/initialisation.py +0 -102
- egse/csl/mech_pos_settings.yaml +0 -18
- egse/das.py +0 -1240
- egse/das.yaml +0 -7
- egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
- egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
- egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
- egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
- egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
- egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
- egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
- egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
- egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
- egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
- egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
- egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
- egse/decorators.py +0 -514
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2698
- egse/dpu/ccd_ui.py +0 -514
- egse/dpu/dpu.py +0 -783
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -671
- egse/dpu/fitsgen.py +0 -2096
- egse/dpu/fitsgen_ui.py +0 -399
- egse/dpu/hdf5_model.py +0 -332
- egse/dpu/hdf5_ui.py +0 -277
- egse/dpu/hdf5_viewer.py +0 -506
- egse/dpu/hk_ui.py +0 -468
- egse/dpu_commands.py +0 -81
- egse/dsi/__init__.py +0 -33
- egse/dsi/_libesl.py +0 -232
- egse/dsi/constants.py +0 -296
- egse/dsi/esl.py +0 -630
- egse/dsi/rmap.py +0 -444
- egse/dsi/rmapci.py +0 -39
- egse/dsi/spw.py +0 -335
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -318
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -26
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -37
- egse/fdir/fdir_manager_controller.py +0 -136
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -15
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -30
- egse/fdir/fdir_remote_controller.py +0 -30
- egse/fdir/fdir_remote_cs.py +0 -94
- egse/fdir/fdir_remote_interface.py +0 -9
- egse/fdir/fdir_remote_popup.py +0 -26
- egse/fee/__init__.py +0 -106
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/feesim.py +0 -914
- egse/fee/n_fee_hk.py +0 -768
- egse/fee/nfee.py +0 -188
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -49
- egse/filterwheel/eksma/fw8smc4.py +0 -657
- egse/filterwheel/eksma/fw8smc4.yaml +0 -121
- egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
- egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
- egse/filterwheel/eksma/fw8smc4_protocol.py +0 -82
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -115
- egse/filterwheel/eksma/fw8smc5.yaml +0 -105
- egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
- egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
- egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
- egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
- egse/filterwheel/eksma/fw8smc5_ui.py +0 -1065
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -710
- egse/fov/fov_ui.py +0 -859
- egse/fov/fov_ui_controller.py +0 -140
- egse/fov/fov_ui_model.py +0 -200
- egse/fov/fov_ui_view.py +0 -345
- egse/gimbal/__init__.py +0 -32
- egse/gimbal/symetrie/__init__.py +0 -26
- egse/gimbal/symetrie/alpha.py +0 -586
- egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
- egse/gimbal/symetrie/gimbal.py +0 -877
- egse/gimbal/symetrie/gimbal.yaml +0 -168
- egse/gimbal/symetrie/gimbal_cs.py +0 -183
- egse/gimbal/symetrie/gimbal_protocol.py +0 -138
- egse/gimbal/symetrie/gimbal_ui.py +0 -361
- egse/gimbal/symetrie/pmac.py +0 -1006
- egse/gimbal/symetrie/pmac_regex.py +0 -83
- egse/graph.py +0 -132
- egse/gui/__init__.py +0 -47
- egse/gui/buttons.py +0 -378
- egse/gui/focalplane.py +0 -1285
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -587
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- egse/gui/styles.qss +0 -48
- egse/gui/switch.py +0 -112
- egse/h5.py +0 -274
- egse/help/__init__.py +0 -0
- egse/help/help_ui.py +0 -126
- egse/hexapod/__init__.py +0 -32
- egse/hexapod/symetrie/__init__.py +0 -137
- egse/hexapod/symetrie/alpha.py +0 -874
- egse/hexapod/symetrie/dynalpha.py +0 -1387
- egse/hexapod/symetrie/hexapod_ui.py +0 -1516
- egse/hexapod/symetrie/pmac.py +0 -1010
- egse/hexapod/symetrie/pmac_regex.py +0 -83
- egse/hexapod/symetrie/puna.py +0 -1167
- egse/hexapod/symetrie/puna.yaml +0 -193
- egse/hexapod/symetrie/puna_cs.py +0 -195
- egse/hexapod/symetrie/puna_protocol.py +0 -134
- egse/hexapod/symetrie/puna_ui.py +0 -433
- egse/hexapod/symetrie/punaplus.py +0 -107
- egse/hexapod/symetrie/zonda.py +0 -872
- egse/hexapod/symetrie/zonda.yaml +0 -337
- egse/hexapod/symetrie/zonda_cs.py +0 -172
- egse/hexapod/symetrie/zonda_devif.py +0 -414
- egse/hexapod/symetrie/zonda_protocol.py +0 -123
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -791
- egse/icons/aeu-cs-start.svg +0 -117
- egse/icons/aeu-cs-stop.svg +0 -118
- egse/icons/aeu-cs.svg +0 -107
- egse/icons/aeu_cs-started.svg +0 -112
- egse/icons/aeu_cs-stopped.svg +0 -112
- egse/icons/aeu_cs.svg +0 -55
- egse/icons/alert.svg +0 -1
- egse/icons/arrow-double-left.png +0 -0
- egse/icons/arrow-double-right.png +0 -0
- egse/icons/arrow-up.svg +0 -11
- egse/icons/backward.svg +0 -1
- egse/icons/busy.svg +0 -1
- egse/icons/cleaning.svg +0 -115
- egse/icons/color-scheme.svg +0 -1
- egse/icons/cs-connected-alert.svg +0 -91
- egse/icons/cs-connected-disabled.svg +0 -43
- egse/icons/cs-connected.svg +0 -89
- egse/icons/cs-not-connected.svg +0 -44
- egse/icons/double-left-arrow.svg +0 -1
- egse/icons/double-right-arrow.svg +0 -1
- egse/icons/erase-disabled.svg +0 -19
- egse/icons/erase.svg +0 -59
- egse/icons/fitsgen-start.svg +0 -47
- egse/icons/fitsgen-stop.svg +0 -48
- egse/icons/fitsgen.svg +0 -1
- egse/icons/forward.svg +0 -1
- egse/icons/fov-hk-start.svg +0 -33
- egse/icons/fov-hk-stop.svg +0 -37
- egse/icons/fov-hk.svg +0 -1
- egse/icons/front-desk.svg +0 -1
- egse/icons/home-actioned.svg +0 -15
- egse/icons/home-disabled.svg +0 -15
- egse/icons/home.svg +0 -13
- egse/icons/info.svg +0 -1
- egse/icons/invalid.png +0 -0
- egse/icons/led-green.svg +0 -20
- egse/icons/led-grey.svg +0 -20
- egse/icons/led-orange.svg +0 -20
- egse/icons/led-red.svg +0 -20
- egse/icons/led-square-green.svg +0 -134
- egse/icons/led-square-grey.svg +0 -134
- egse/icons/led-square-orange.svg +0 -134
- egse/icons/led-square-red.svg +0 -134
- egse/icons/limit-switch-all-green.svg +0 -115
- egse/icons/limit-switch-all-red.svg +0 -117
- egse/icons/limit-switch-el+.svg +0 -116
- egse/icons/limit-switch-el-.svg +0 -117
- egse/icons/location-marker.svg +0 -1
- egse/icons/logo-dpu.svg +0 -48
- egse/icons/logo-gimbal.svg +0 -112
- egse/icons/logo-huber.svg +0 -23
- egse/icons/logo-ogse.svg +0 -31
- egse/icons/logo-puna.svg +0 -92
- egse/icons/logo-tcs.svg +0 -29
- egse/icons/logo-zonda.svg +0 -66
- egse/icons/maximize.svg +0 -1
- egse/icons/meter.svg +0 -1
- egse/icons/more.svg +0 -45
- egse/icons/n-fee-hk-start.svg +0 -24
- egse/icons/n-fee-hk-stop.svg +0 -25
- egse/icons/n-fee-hk.svg +0 -83
- egse/icons/observing-off.svg +0 -46
- egse/icons/observing-on.svg +0 -46
- egse/icons/open-document-hdf5.png +0 -0
- egse/icons/open-document-hdf5.svg +0 -21
- egse/icons/ops-mode.svg +0 -1
- egse/icons/play-green.svg +0 -17
- egse/icons/plugged-disabled.svg +0 -27
- egse/icons/plugged.svg +0 -21
- egse/icons/pm_ui.svg +0 -1
- egse/icons/power-button-green.svg +0 -27
- egse/icons/power-button-red.svg +0 -27
- egse/icons/power-button.svg +0 -27
- egse/icons/radar.svg +0 -1
- egse/icons/radioactive.svg +0 -2
- egse/icons/reload.svg +0 -1
- egse/icons/remote-control-off.svg +0 -28
- egse/icons/remote-control-on.svg +0 -28
- egse/icons/repeat-blue.svg +0 -15
- egse/icons/repeat.svg +0 -1
- egse/icons/settings.svg +0 -1
- egse/icons/shrink.svg +0 -1
- egse/icons/shutter.svg +0 -1
- egse/icons/sign-off.svg +0 -1
- egse/icons/sign-on.svg +0 -1
- egse/icons/sim-mode.svg +0 -1
- egse/icons/small-buttons-go.svg +0 -20
- egse/icons/small-buttons-minus.svg +0 -51
- egse/icons/small-buttons-plus.svg +0 -51
- egse/icons/sponge.svg +0 -220
- egse/icons/start-button-disabled.svg +0 -84
- egse/icons/start-button.svg +0 -50
- egse/icons/stop-button-disabled.svg +0 -84
- egse/icons/stop-button.svg +0 -50
- egse/icons/stop-red.svg +0 -17
- egse/icons/stop.svg +0 -1
- egse/icons/switch-disabled-square.svg +0 -87
- egse/icons/switch-disabled.svg +0 -15
- egse/icons/switch-off-square.svg +0 -87
- egse/icons/switch-off.svg +0 -72
- egse/icons/switch-on-square.svg +0 -87
- egse/icons/switch-on.svg +0 -61
- egse/icons/temperature-control.svg +0 -44
- egse/icons/th_ui_logo.svg +0 -1
- egse/icons/unplugged.svg +0 -23
- egse/icons/unvalid.png +0 -0
- egse/icons/user-interface.svg +0 -1
- egse/icons/vacuum.svg +0 -1
- egse/icons/valid.png +0 -0
- egse/icons/zoom-to-pixel-dark.svg +0 -64
- egse/icons/zoom-to-pixel-white.svg +0 -36
- egse/images/big-rotation-stage.png +0 -0
- egse/images/connected-100.png +0 -0
- egse/images/cross.svg +0 -6
- egse/images/disconnected-100.png +0 -0
- egse/images/gui-icon.png +0 -0
- egse/images/home.svg +0 -6
- egse/images/info-icon.png +0 -0
- egse/images/led-black.svg +0 -89
- egse/images/led-green.svg +0 -85
- egse/images/led-orange.svg +0 -85
- egse/images/led-red.svg +0 -85
- egse/images/load-icon.png +0 -0
- egse/images/load-setup.png +0 -0
- egse/images/load.png +0 -0
- egse/images/pause.png +0 -0
- egse/images/play-button.svg +0 -8
- egse/images/play.png +0 -0
- egse/images/process-status.png +0 -0
- egse/images/restart.png +0 -0
- egse/images/search.png +0 -0
- egse/images/sma.png +0 -0
- egse/images/start.png +0 -0
- egse/images/stop-button.svg +0 -8
- egse/images/stop.png +0 -0
- egse/images/switch-off.svg +0 -48
- egse/images/switch-on.svg +0 -48
- egse/images/undo.png +0 -0
- egse/images/update-button.svg +0 -11
- egse/imageviewer/exposureselection.py +0 -475
- egse/imageviewer/imageviewer.py +0 -198
- egse/imageviewer/matchfocalplane.py +0 -179
- egse/imageviewer/subfieldposition.py +0 -133
- egse/lampcontrol/__init__.py +0 -4
- egse/lampcontrol/beaglebone/beaglebone.py +0 -178
- egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
- egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
- egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
- egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
- egse/lampcontrol/energetiq/__init__.py +0 -22
- egse/lampcontrol/energetiq/eq99.yaml +0 -98
- egse/lampcontrol/energetiq/lampEQ99.py +0 -283
- egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
- egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
- egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
- egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -71
- egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
- egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
- egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
- egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
- egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
- egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
- egse/lib/ximc/libximc.framework/libbindy.so +0 -0
- egse/lib/ximc/libximc.framework/libximc +0 -0
- egse/lib/ximc/libximc.framework/libximc.so +0 -0
- egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
- egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
- egse/lib/ximc/pyximc.py +0 -922
- egse/listener.py +0 -179
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -102
- egse/mixin.py +0 -464
- egse/monitoring.py +0 -95
- egse/ni/alarms/__init__.py +0 -26
- egse/ni/alarms/cdaq9375.py +0 -300
- egse/ni/alarms/cdaq9375.yaml +0 -89
- egse/ni/alarms/cdaq9375_cs.py +0 -130
- egse/ni/alarms/cdaq9375_devif.py +0 -183
- egse/ni/alarms/cdaq9375_protocol.py +0 -48
- egse/obs_inspection.py +0 -165
- egse/observer.py +0 -41
- egse/obsid.py +0 -163
- egse/powermeter/__init__.py +0 -0
- egse/powermeter/ni/__init__.py +0 -38
- egse/powermeter/ni/cdaq9184.py +0 -224
- egse/powermeter/ni/cdaq9184.yaml +0 -73
- egse/powermeter/ni/cdaq9184_cs.py +0 -130
- egse/powermeter/ni/cdaq9184_devif.py +0 -201
- egse/powermeter/ni/cdaq9184_protocol.py +0 -48
- egse/powermeter/ni/cdaq9184_ui.py +0 -544
- egse/powermeter/thorlabs/__init__.py +0 -25
- egse/powermeter/thorlabs/pm100a.py +0 -380
- egse/powermeter/thorlabs/pm100a.yaml +0 -132
- egse/powermeter/thorlabs/pm100a_cs.py +0 -136
- egse/powermeter/thorlabs/pm100a_devif.py +0 -127
- egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
- egse/powermeter/thorlabs/pm100a_ui.py +0 -725
- egse/process.py +0 -451
- egse/procman/__init__.py +0 -834
- egse/procman/cannot_start_process_popup.py +0 -43
- egse/procman/procman.yaml +0 -49
- egse/procman/procman_cs.py +0 -201
- egse/procman/procman_ui.py +0 -2081
- egse/protocol.py +0 -605
- egse/proxy.py +0 -531
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -693
- egse/resource.py +0 -333
- egse/rmap.py +0 -406
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -247
- egse/services.yaml +0 -68
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1181
- egse/shutter/__init__.py +0 -0
- egse/shutter/thorlabs/__init__.py +0 -19
- egse/shutter/thorlabs/ksc101.py +0 -205
- egse/shutter/thorlabs/ksc101.yaml +0 -105
- egse/shutter/thorlabs/ksc101_cs.py +0 -136
- egse/shutter/thorlabs/ksc101_devif.py +0 -201
- egse/shutter/thorlabs/ksc101_protocol.py +0 -71
- egse/shutter/thorlabs/ksc101_ui.py +0 -548
- egse/shutter/thorlabs/sc10.py +0 -82
- egse/shutter/thorlabs/sc10.yaml +0 -52
- egse/shutter/thorlabs/sc10_controller.py +0 -81
- egse/shutter/thorlabs/sc10_cs.py +0 -108
- egse/shutter/thorlabs/sc10_interface.py +0 -25
- egse/shutter/thorlabs/sc10_simulator.py +0 -30
- egse/simulator.py +0 -41
- egse/slack.py +0 -61
- egse/socketdevice.py +0 -218
- egse/sockets.py +0 -218
- egse/spw.py +0 -1401
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -245
- egse/stages/aerotech/ensemble.yaml +0 -205
- egse/stages/aerotech/ensemble_controller.py +0 -275
- egse/stages/aerotech/ensemble_cs.py +0 -110
- egse/stages/aerotech/ensemble_interface.py +0 -132
- egse/stages/aerotech/ensemble_parameters.py +0 -433
- egse/stages/aerotech/ensemble_simulator.py +0 -27
- egse/stages/aerotech/mgse_sim.py +0 -188
- egse/stages/arun/smd3.py +0 -110
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -470
- egse/stages/arun/smd3_cs.py +0 -112
- egse/stages/arun/smd3_interface.py +0 -53
- egse/stages/arun/smd3_simulator.py +0 -27
- egse/stages/arun/smd3_stop.py +0 -16
- egse/stages/huber/__init__.py +0 -49
- egse/stages/huber/smc9300.py +0 -920
- egse/stages/huber/smc9300.yaml +0 -63
- egse/stages/huber/smc9300_cs.py +0 -178
- egse/stages/huber/smc9300_devif.py +0 -345
- egse/stages/huber/smc9300_protocol.py +0 -113
- egse/stages/huber/smc9300_sim.py +0 -547
- egse/stages/huber/smc9300_ui.py +0 -973
- egse/state.py +0 -173
- egse/statemachine.py +0 -274
- egse/storage/__init__.py +0 -1067
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -79
- egse/storage/storage_cs.py +0 -231
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -417
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1611
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -879
- egse/tcs/tcs.yaml +0 -14
- egse/tcs/tcs_cs.py +0 -202
- egse/tcs/tcs_devif.py +0 -292
- egse/tcs/tcs_protocol.py +0 -180
- egse/tcs/tcs_sim.py +0 -177
- egse/tcs/tcs_ui.py +0 -543
- egse/tdms.py +0 -171
- egse/tempcontrol/__init__.py +0 -23
- egse/tempcontrol/agilent/agilent34970.py +0 -109
- egse/tempcontrol/agilent/agilent34970.yaml +0 -44
- egse/tempcontrol/agilent/agilent34970_cs.py +0 -114
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -96
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -115
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -98
- egse/tempcontrol/beaglebone/beaglebone.py +0 -341
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -134
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -674
- egse/tempcontrol/digalox/digalox.py +0 -115
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -108
- egse/tempcontrol/digalox/digalox_protocol.py +0 -56
- egse/tempcontrol/keithley/__init__.py +0 -33
- egse/tempcontrol/keithley/daq6510.py +0 -662
- egse/tempcontrol/keithley/daq6510.yaml +0 -105
- egse/tempcontrol/keithley/daq6510_cs.py +0 -163
- egse/tempcontrol/keithley/daq6510_devif.py +0 -343
- egse/tempcontrol/keithley/daq6510_protocol.py +0 -79
- egse/tempcontrol/keithley/daq6510_sim.py +0 -186
- egse/tempcontrol/lakeshore/__init__.py +0 -33
- egse/tempcontrol/lakeshore/lsci.py +0 -361
- egse/tempcontrol/lakeshore/lsci.yaml +0 -162
- egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
- egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
- egse/tempcontrol/lakeshore/lsci_protocol.py +0 -76
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -387
- egse/tempcontrol/ni/__init__.py +0 -0
- egse/tempcontrol/spid/spid.py +0 -109
- egse/tempcontrol/spid/spid.yaml +0 -81
- egse/tempcontrol/spid/spid_controller.py +0 -279
- egse/tempcontrol/spid/spid_cs.py +0 -136
- egse/tempcontrol/spid/spid_protocol.py +0 -107
- egse/tempcontrol/spid/spid_ui.py +0 -723
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -867
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -116
- egse/tempcontrol/srs/ptc10_protocol.py +0 -39
- egse/tempcontrol/srs/ptc10_ui.py +0 -906
- egse/ups/apc/apc.py +0 -236
- egse/ups/apc/apc.yaml +0 -45
- egse/ups/apc/apc_cs.py +0 -101
- egse/ups/apc/apc_protocol.py +0 -125
- egse/user.yaml +0 -7
- egse/vacuum/beaglebone/beaglebone.py +0 -149
- egse/vacuum/beaglebone/beaglebone.yaml +0 -44
- egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
- egse/vacuum/beaglebone/beaglebone_devif.py +0 -159
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -192
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -91
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -124
- egse/vacuum/instrutech/igm402_cs.py +0 -108
- egse/vacuum/instrutech/igm402_interface.py +0 -49
- egse/vacuum/instrutech/igm402_simulator.py +0 -36
- egse/vacuum/keller/kellerBus.py +0 -256
- egse/vacuum/keller/leo3.py +0 -100
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -81
- egse/vacuum/keller/leo3_cs.py +0 -101
- egse/vacuum/keller/leo3_interface.py +0 -33
- egse/vacuum/mks/evision.py +0 -86
- egse/vacuum/mks/evision.yaml +0 -75
- egse/vacuum/mks/evision_cs.py +0 -101
- egse/vacuum/mks/evision_devif.py +0 -313
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -701
- egse/vacuum/pfeiffer/acp40.py +0 -87
- egse/vacuum/pfeiffer/acp40.yaml +0 -60
- egse/vacuum/pfeiffer/acp40_controller.py +0 -117
- egse/vacuum/pfeiffer/acp40_cs.py +0 -109
- egse/vacuum/pfeiffer/acp40_interface.py +0 -40
- egse/vacuum/pfeiffer/acp40_simulator.py +0 -37
- egse/vacuum/pfeiffer/tc400.py +0 -87
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -136
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -35
- egse/vacuum/pfeiffer/tpg261.py +0 -80
- egse/vacuum/pfeiffer/tpg261.yaml +0 -66
- egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
- egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
- egse/vacuum/pfeiffer/tpg261_interface.py +0 -59
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -23
- egse/version.py +0 -174
- egse/visitedpositions.py +0 -398
- egse/windowing.py +0 -213
- egse/zmq/__init__.py +0 -28
- egse/zmq/spw.py +0 -160
- egse/zmq_ser.py +0 -41
- scripts/alerts/cold.yaml +0 -278
- scripts/alerts/example_alerts.yaml +0 -54
- scripts/alerts/transition.yaml +0 -14
- scripts/alerts/warm.yaml +0 -49
- scripts/analyse_n_fee_hk_data.py +0 -52
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/check_tcs_calib_coef.py +0 -90
- scripts/correct_ccd_cold_temperature_cal.py +0 -157
- scripts/create_hdf5_report.py +0 -293
- scripts/csl_model.py +0 -420
- scripts/csl_restore_setup.py +0 -229
- scripts/export-grafana-dashboards.py +0 -49
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -54
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -10
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -61
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -59
- scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
- scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
- scripts/fix_csv.py +0 -80
- scripts/ias/correct_ccd_temp_cal_elfique.py +0 -43
- scripts/ias/correct_ccd_temp_cal_floreffe.py +0 -43
- scripts/ias/correct_trp_swap_achel.py +0 -199
- scripts/inta/correct_ccd_temp_cal_duvel.py +0 -43
- scripts/inta/correct_ccd_temp_cal_gueuze.py +0 -43
- scripts/n_fee_supply_voltage_calculation.py +0 -92
- scripts/playground.py +0 -30
- scripts/print_hdf5_hk_data.py +0 -68
- scripts/print_register_map.py +0 -43
- scripts/remove_lines_between_matches.py +0 -188
- scripts/sron/commanding/control_heaters.py +0 -44
- scripts/sron/commanding/pumpdown.py +0 -46
- scripts/sron/commanding/set_pid_setpoint.py +0 -19
- scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
- scripts/sron/commanding/shutdown_pumps.py +0 -33
- scripts/sron/correct_mgse_coordinates_brigand_chimay.py +0 -272
- scripts/sron/correct_trp_swap_brigand.py +0 -204
- scripts/sron/gimbal_conversions.py +0 -75
- scripts/sron/tm_gen/tm_gen_agilent.py +0 -37
- scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
- scripts/sron/tm_gen/tm_gen_spid.py +0 -13
- scripts/update_operational_cgse.py +0 -268
- scripts/update_operational_cgse_old.py +0 -273
egse/imageviewer/imageviewer.py
DELETED
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Version of the Ginga reference viewer with extra, PLATO-specific plugins. Currently
|
|
3
|
-
the following plugins have been implemented:
|
|
4
|
-
|
|
5
|
-
* SubFieldPosition: visualising the position of the sub-field an image represents, on the focal plane;
|
|
6
|
-
* MatchFocalPlane: rotating the image, to match the orientation of the focal-plane reference frame
|
|
7
|
-
(rather than the CCD reference frame).
|
|
8
|
-
|
|
9
|
-
To start the image viewer execute the following command:
|
|
10
|
-
|
|
11
|
-
$ ./bin/start-image-viewer.bash
|
|
12
|
-
|
|
13
|
-
This is the same as the Ginga reference viewer, with all the additional PLATO-specific
|
|
14
|
-
plugins. These plugins will then be available via the `Operation` button in the Plugin Manager bar
|
|
15
|
-
(under `PLATO`).
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
import ginga.rv.main as rv
|
|
19
|
-
from PyQt5.QtWidgets import QApplication
|
|
20
|
-
from ginga.misc.Bunch import Bunch
|
|
21
|
-
import sys
|
|
22
|
-
import os
|
|
23
|
-
|
|
24
|
-
from ginga.misc import Settings, log
|
|
25
|
-
from ginga.util import paths
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class ImageViewer(rv.ReferenceViewer):
|
|
29
|
-
# Plugins specifically for PLATO
|
|
30
|
-
|
|
31
|
-
plato_plugins = [
|
|
32
|
-
Bunch(module="SubFieldPosition", tab="Sub-Field Position", workspace="right", start=False,
|
|
33
|
-
menu="Sub-field Position", category="PLATO", ptype="local"),
|
|
34
|
-
Bunch(module="ExposureSelection", tab="Window and Exposure Selection", workspace="lleft", start=True,
|
|
35
|
-
menu="Window and Exposure Selection", category="PLATO", ptype="local"),
|
|
36
|
-
]
|
|
37
|
-
|
|
38
|
-
def __init__(self, sys_argv, layout=rv.default_layout):
|
|
39
|
-
"""
|
|
40
|
-
Initialisation of the Ginga reference viewer, with additional PLATO-specific plugins.
|
|
41
|
-
"""
|
|
42
|
-
|
|
43
|
-
super().__init__()
|
|
44
|
-
|
|
45
|
-
self.plugins = self.plugins + self.plato_plugins
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
self.add_default_plugins()
|
|
49
|
-
self.add_separately_distributed_plugins()
|
|
50
|
-
|
|
51
|
-
# Parse command line options with argparse module
|
|
52
|
-
from argparse import ArgumentParser
|
|
53
|
-
|
|
54
|
-
argprs = ArgumentParser(description="Run the image viewer.")
|
|
55
|
-
self.add_default_options(argprs)
|
|
56
|
-
argprs.add_argument('-V', '--version', action='version', version='%(prog)s {}'.format(rv.version.version))
|
|
57
|
-
(options, args) = argprs.parse_known_args(sys_argv[1:])
|
|
58
|
-
|
|
59
|
-
if options.display:
|
|
60
|
-
os.environ['DISPLAY'] = options.display
|
|
61
|
-
|
|
62
|
-
# Are we debugging this?
|
|
63
|
-
if options.debug:
|
|
64
|
-
|
|
65
|
-
import pdb
|
|
66
|
-
|
|
67
|
-
pdb.run('viewer.main(options, args)')
|
|
68
|
-
|
|
69
|
-
# Are we profiling this?
|
|
70
|
-
elif options.profile:
|
|
71
|
-
import profile
|
|
72
|
-
|
|
73
|
-
print(("%s profile:" % sys_argv[0]))
|
|
74
|
-
profile.runctx('viewer.main(options, args)', dict(options=options, args=args, viewer=viewer), {})
|
|
75
|
-
|
|
76
|
-
else:
|
|
77
|
-
|
|
78
|
-
# Create a logger
|
|
79
|
-
logger = log.get_logger(name='ginga', options=options)
|
|
80
|
-
|
|
81
|
-
# Get settings (preferences)
|
|
82
|
-
basedir = paths.ginga_home
|
|
83
|
-
if not os.path.exists(basedir):
|
|
84
|
-
try:
|
|
85
|
-
os.mkdir(basedir)
|
|
86
|
-
except OSError as e:
|
|
87
|
-
logger.warning("Couldn't create ginga settings area (%s): %s" % (basedir, str(e)))
|
|
88
|
-
logger.warning("Preferences will not be able to be saved")
|
|
89
|
-
|
|
90
|
-
self.main(options, args)
|
|
91
|
-
|
|
92
|
-
# prefs = Settings.Preferences(basefolder=basedir, logger=logger)
|
|
93
|
-
# settings = prefs.create_category('plato')
|
|
94
|
-
# settings.set_defaults(channel_prefix="PLATO")
|
|
95
|
-
# settings.load(onError='silent')
|
|
96
|
-
|
|
97
|
-
# class ImageViewer(rv.ReferenceViewer):
|
|
98
|
-
#
|
|
99
|
-
# # Plugins specifically for PLATO
|
|
100
|
-
#
|
|
101
|
-
# plato_plugins = [
|
|
102
|
-
# Bunch(module="SubFieldPosition", tab="Sub-Field Position", workspace="right", start=False, menu="Sub-field Position", category="PLATO", ptype="local"),
|
|
103
|
-
# Bunch(module="ExposureSelection", tab="Window and Exposure Selection", workspace="lleft", start=True, menu="Window and Exposure Selection", category="PLATO", ptype="local"),
|
|
104
|
-
# ]
|
|
105
|
-
#
|
|
106
|
-
#
|
|
107
|
-
# def __init__(self, layout=rv.default_layout):
|
|
108
|
-
#
|
|
109
|
-
# """
|
|
110
|
-
# Initialisation of the Ginga reference viewer, with additional PLATO-specific plugins.
|
|
111
|
-
# """
|
|
112
|
-
#
|
|
113
|
-
# super().__init__()
|
|
114
|
-
#
|
|
115
|
-
# self.plugins = self.plugins + self.plato_plugins
|
|
116
|
-
#
|
|
117
|
-
#
|
|
118
|
-
# def image_viewer(sys_argv):
|
|
119
|
-
#
|
|
120
|
-
# """
|
|
121
|
-
# Create the image viewer from the command line.
|
|
122
|
-
#
|
|
123
|
-
# Args:
|
|
124
|
-
# - sys_argv: Command line arguments.
|
|
125
|
-
# """
|
|
126
|
-
#
|
|
127
|
-
# viewer = ImageViewer(layout=rv.default_layout)
|
|
128
|
-
#
|
|
129
|
-
# viewer.add_default_plugins()
|
|
130
|
-
# viewer.add_separately_distributed_plugins()
|
|
131
|
-
#
|
|
132
|
-
# # Parse command line options with argparse module
|
|
133
|
-
# from argparse import ArgumentParser
|
|
134
|
-
#
|
|
135
|
-
# argprs = ArgumentParser(description="Run the image viewer.")
|
|
136
|
-
# viewer.add_default_options(argprs)
|
|
137
|
-
# argprs.add_argument('-V', '--version', action='version',
|
|
138
|
-
# version='%(prog)s {}'.format(rv.version.version))
|
|
139
|
-
# (options, args) = argprs.parse_known_args(sys_argv[1:])
|
|
140
|
-
#
|
|
141
|
-
#
|
|
142
|
-
# if options.display:
|
|
143
|
-
# os.environ['DISPLAY'] = options.display
|
|
144
|
-
#
|
|
145
|
-
# # Are we debugging this?
|
|
146
|
-
# if options.debug:
|
|
147
|
-
# import pdb
|
|
148
|
-
#
|
|
149
|
-
# pdb.run('viewer.main(options, args)')
|
|
150
|
-
#
|
|
151
|
-
# # Are we profiling this?
|
|
152
|
-
# elif options.profile:
|
|
153
|
-
# import profile
|
|
154
|
-
#
|
|
155
|
-
# print(("%s profile:" % sys_argv[0]))
|
|
156
|
-
# profile.runctx('viewer.main(options, args)',
|
|
157
|
-
# dict(options=options, args=args, viewer=viewer), {})
|
|
158
|
-
#
|
|
159
|
-
# else:
|
|
160
|
-
#
|
|
161
|
-
# # Create a logger
|
|
162
|
-
# logger = log.get_logger(name='ginga', options=options)
|
|
163
|
-
#
|
|
164
|
-
# # Get settings (preferences)
|
|
165
|
-
# basedir = paths.ginga_home
|
|
166
|
-
# if not os.path.exists(basedir):
|
|
167
|
-
# try:
|
|
168
|
-
# os.mkdir(basedir)
|
|
169
|
-
# except OSError as e:
|
|
170
|
-
# logger.warning(
|
|
171
|
-
# "Couldn't create ginga settings area (%s): %s" % (
|
|
172
|
-
# basedir, str(e)))
|
|
173
|
-
# logger.warning("Preferences will not be able to be saved")
|
|
174
|
-
#
|
|
175
|
-
# viewer.main(options, args)
|
|
176
|
-
#
|
|
177
|
-
# # prefs = Settings.Preferences(basefolder=basedir, logger=logger)
|
|
178
|
-
# # settings = prefs.create_category('plato')
|
|
179
|
-
# # settings.set_defaults(channel_prefix="PLATO")
|
|
180
|
-
# # settings.load(onError='silent')
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
def main():
|
|
184
|
-
|
|
185
|
-
args = list(sys.argv)
|
|
186
|
-
|
|
187
|
-
app = QApplication(args)
|
|
188
|
-
|
|
189
|
-
# view = image_viewer(sys.argv)
|
|
190
|
-
view = ImageViewer(sys.argv)
|
|
191
|
-
view.show()
|
|
192
|
-
|
|
193
|
-
return app.exec_()
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
if __name__ == '__main__':
|
|
197
|
-
sys.exit(main())
|
|
198
|
-
# image_viewer(sys.argv)
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module provides a (local) plugin for the Ginga reference viewer, rotating the
|
|
3
|
-
sub-field to match the orientation of the focal plane. The orientation angle of the
|
|
4
|
-
sub-field (and CCD) w.r.t. the focal plane (in degrees) is read from the "CROTA2"
|
|
5
|
-
keyword in the header of the loaded FITS file.
|
|
6
|
-
|
|
7
|
-
To start the Ginga reference viewer, with this extra plugin, execute the following set of commands:
|
|
8
|
-
|
|
9
|
-
$ mkdir $HOME/.ginga/plugins
|
|
10
|
-
$ cp matchfocalplane.py $HOME/.ginga/plugins/MatchFocalPlane.py
|
|
11
|
-
$ ginga --plugins=MatchFocalPlane --loglevel=20 --stderr --log=/tmp/ginga.log
|
|
12
|
-
|
|
13
|
-
The plugin will then be available via the "Operation" button in the Plugin Manager bar
|
|
14
|
-
(currently under "Custom").
|
|
15
|
-
|
|
16
|
-
Alternatively, you can start the image viewer with the command:
|
|
17
|
-
|
|
18
|
-
$ ./bin/start-image-viewer.bash
|
|
19
|
-
|
|
20
|
-
This is the same as the Ginga reference viewer, with all the additional PLATO-specific
|
|
21
|
-
plugins. These plugins will then be available via the "Operation" button in the Plugin Manager bar
|
|
22
|
-
(under "PLATO").
|
|
23
|
-
"""
|
|
24
|
-
|
|
25
|
-
from ginga import GingaPlugin
|
|
26
|
-
from egse.gui.focalplane import FocalPlaneWidgetWithSubField
|
|
27
|
-
from ginga.gw import Widgets
|
|
28
|
-
|
|
29
|
-
class MatchFocalPlane(GingaPlugin.LocalPlugin):
|
|
30
|
-
|
|
31
|
-
def __init__(self, fv, fitsimage):
|
|
32
|
-
|
|
33
|
-
"""
|
|
34
|
-
Initialisation of a new (local) plugin for the Ginga reference viewer, to rotate
|
|
35
|
-
the sub-field to match the orientation of the focal plane. The orientation angle
|
|
36
|
-
of the sub-field (and CCD) w.r.t. the focal plane (in degrees) is read from the
|
|
37
|
-
"CROTA2" keyword in the header of the loaded FITS file.
|
|
38
|
-
Called when the plugin is loaded from the first time.
|
|
39
|
-
|
|
40
|
-
:param fv: Reference to the Ginga (reference viewer) shell.
|
|
41
|
-
|
|
42
|
-
:param fitsimage: Reference to the specific viewer object associated with
|
|
43
|
-
the channel on which the plugin is being invoked.
|
|
44
|
-
"""
|
|
45
|
-
|
|
46
|
-
super(MatchFocalPlane, self).__init__(fv, fitsimage)
|
|
47
|
-
|
|
48
|
-
self.t_ = self.fitsimage.get_settings()
|
|
49
|
-
|
|
50
|
-
def build_gui(self, container):
|
|
51
|
-
|
|
52
|
-
"""
|
|
53
|
-
When the plugin is activated, a GUI is built and packed into the given
|
|
54
|
-
container. This consists of four buttons:
|
|
55
|
-
- "Match FP": to rotate the sub-field to match the orientation of the focal plane;
|
|
56
|
-
- "Restore": to go back to the original orientation of the sub-field (with the readout
|
|
57
|
-
register at the bottom of the CCD);
|
|
58
|
-
- "Save": to open this image next time with the current orientation;
|
|
59
|
-
- "Close": to close the plugin (without saving the current orientation).
|
|
60
|
-
|
|
61
|
-
:param container: Container in which to pack the GUI.
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
vbox = Widgets.VBox()
|
|
65
|
-
vbox.set_border_width(1)
|
|
66
|
-
vbox.set_spacing(1)
|
|
67
|
-
|
|
68
|
-
# No FITS file loaded
|
|
69
|
-
|
|
70
|
-
if self.fitsimage.get_image() is None:
|
|
71
|
-
|
|
72
|
-
text = "No image has been loaded into the current channel. Please, close this plugin by pressing the \"Close\" button."
|
|
73
|
-
no_image_label = Widgets.Label(text)
|
|
74
|
-
vbox.add_widget(no_image_label)
|
|
75
|
-
|
|
76
|
-
# FITS file loaded
|
|
77
|
-
|
|
78
|
-
else:
|
|
79
|
-
|
|
80
|
-
header = self.fitsimage.get_image().get_header()
|
|
81
|
-
keys = list(header.keys())
|
|
82
|
-
|
|
83
|
-
if "CROTA2" in keys:
|
|
84
|
-
|
|
85
|
-
self.rotation_angle = header.get_card("CROTA2")["value"]
|
|
86
|
-
|
|
87
|
-
else:
|
|
88
|
-
text = "The loaded FITS file does not contain the CROTA2 keyword in the header. Please, close this plugin by pressing the \"Close\" button."
|
|
89
|
-
no_crota2_label = Widgets.Label(text)
|
|
90
|
-
vbox.add_widget(no_crota2_label)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
buttons = Widgets.HBox()
|
|
94
|
-
buttons.set_border_width(4)
|
|
95
|
-
buttons.set_spacing(3)
|
|
96
|
-
|
|
97
|
-
# Match button
|
|
98
|
-
|
|
99
|
-
match_button = Widgets.Button("Match FP")
|
|
100
|
-
match_button.set_tooltip("Rotate the sub-field to match the orientation of the focal plane")
|
|
101
|
-
match_button.add_callback('activated', lambda w: self.match())
|
|
102
|
-
buttons.add_widget(match_button)
|
|
103
|
-
|
|
104
|
-
# Save button
|
|
105
|
-
|
|
106
|
-
save_button = Widgets.Button("Save settings")
|
|
107
|
-
save_button.set_tooltip("Open this image next time with the current orientation")
|
|
108
|
-
save_button.add_callback("activated", lambda w: self.save_settings())
|
|
109
|
-
buttons.add_widget(save_button)
|
|
110
|
-
|
|
111
|
-
# Restore button
|
|
112
|
-
|
|
113
|
-
restore_button = Widgets.Button("Restore")
|
|
114
|
-
restore_button.set_tooltip("Go back to the original orientation of the sub-field (with the readout register at the bottom of the CCD)")
|
|
115
|
-
restore_button.add_callback('activated', lambda w: self.restore())
|
|
116
|
-
buttons.add_widget(restore_button)
|
|
117
|
-
|
|
118
|
-
# Close button
|
|
119
|
-
|
|
120
|
-
close_button = Widgets.Button("Close")
|
|
121
|
-
close_button.set_tooltip("Close this plugin")
|
|
122
|
-
close_button.add_callback('activated', lambda w: self.close())
|
|
123
|
-
buttons.add_widget(close_button)
|
|
124
|
-
|
|
125
|
-
vbox.add_widget(buttons)
|
|
126
|
-
|
|
127
|
-
container.add_widget(vbox, stretch=1)
|
|
128
|
-
|
|
129
|
-
def close(self):
|
|
130
|
-
|
|
131
|
-
"""
|
|
132
|
-
Close action (to execute when the "Close" button is pushed).
|
|
133
|
-
"""
|
|
134
|
-
|
|
135
|
-
self.fv.stop_local_plugin(self.chname, str(self))
|
|
136
|
-
|
|
137
|
-
return True
|
|
138
|
-
|
|
139
|
-
def match(self):
|
|
140
|
-
|
|
141
|
-
"""
|
|
142
|
-
Rotate the image (in the Ginga reference viewer) over the angle, specified by the CROTA2
|
|
143
|
-
keyword in the header of the FITS file.
|
|
144
|
-
"""
|
|
145
|
-
|
|
146
|
-
self.t_.set(rot_deg=self.rotation_angle)
|
|
147
|
-
self.fitsimage.center_image()
|
|
148
|
-
|
|
149
|
-
return True
|
|
150
|
-
|
|
151
|
-
def restore(self):
|
|
152
|
-
|
|
153
|
-
"""
|
|
154
|
-
Go back to the original orientation of the sub-field (with the readout register
|
|
155
|
-
at the bottom of the CCD)
|
|
156
|
-
"""
|
|
157
|
-
|
|
158
|
-
self.t_.set(rot_deg=0.0)
|
|
159
|
-
self.fitsimage.center_image()
|
|
160
|
-
|
|
161
|
-
return True
|
|
162
|
-
|
|
163
|
-
def save_settings(self):
|
|
164
|
-
|
|
165
|
-
"""
|
|
166
|
-
Save the current settings, to open the image next time with the current orientation.
|
|
167
|
-
"""
|
|
168
|
-
|
|
169
|
-
self.t_.save()
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
def __str__(self):
|
|
173
|
-
|
|
174
|
-
"""
|
|
175
|
-
Returns the string representation of this plugin. This needs to be the small-case
|
|
176
|
-
version of the class name in order for the Ginga reference viewer to pick it up.
|
|
177
|
-
"""
|
|
178
|
-
|
|
179
|
-
return "matchfocalplane"
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module provides a (local) plugin for the Ginga reference viewer, visualising
|
|
3
|
-
the position of the sub-field an image represents, on the focal plane. The information
|
|
4
|
-
on the position of the sub-field is read from the header file of the loaded FITS file,
|
|
5
|
-
from the following keywords:
|
|
6
|
-
|
|
7
|
-
* CCD_ID: code of the CCD on which the sub-field lies [1, 2, 3, 4];
|
|
8
|
-
* (-CRPIX2, -CRPIX1): CCD coordinates (row, column) [pixels] of the origin
|
|
9
|
-
of the sub-field in the CCD coordinate system for the CCD with the specified
|
|
10
|
-
code (from the CCD_ID keyword);
|
|
11
|
-
* NAXIS2: number of rows [pixels] in the sub-field;
|
|
12
|
-
* NAXIS2: number of columns [pixels] in the sub-field.
|
|
13
|
-
|
|
14
|
-
To start the Ginga reference viewer, execute the following set of commands:
|
|
15
|
-
|
|
16
|
-
$ mkdir $HOME/.ginga/plugins
|
|
17
|
-
$ cp subfieldposition.py $HOME/.ginga/plugins/SubFieldPosition.py
|
|
18
|
-
$ ginga --plugins=SubFieldPosition --loglevel=20 --stderr --log=/tmp/ginga.log
|
|
19
|
-
|
|
20
|
-
The plugin will then be available via the "Operation" button in the Plugin Manager bar
|
|
21
|
-
(currently under "Custom").
|
|
22
|
-
|
|
23
|
-
Alternatively, you can start the image viewer with the command:
|
|
24
|
-
|
|
25
|
-
$ ./bin/start-image-viewer.bash
|
|
26
|
-
|
|
27
|
-
This is the same as the Ginga reference viewer, with all the additional PLATO-specific
|
|
28
|
-
plugins. These plugins will then be available via the "Operation" button in the Plugin Manager bar
|
|
29
|
-
(under "PLATO").
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
from ginga import GingaPlugin
|
|
33
|
-
from egse.gui.focalplane import FocalPlaneWidgetWithSubField
|
|
34
|
-
from ginga.gw import Widgets
|
|
35
|
-
|
|
36
|
-
class SubFieldPosition(GingaPlugin.LocalPlugin):
|
|
37
|
-
|
|
38
|
-
def __init__(self, fv, fitsimage):
|
|
39
|
-
|
|
40
|
-
"""
|
|
41
|
-
Initialisation of a new (local) plugin for the Ginga reference viewer, to visualise
|
|
42
|
-
the position of the sub-field an image represents, on the focal plane. The information
|
|
43
|
-
on the position of the sub-field is read from the header file of the loaded FITS file
|
|
44
|
-
Called when the plugin is loaded from the first time.
|
|
45
|
-
|
|
46
|
-
Args:
|
|
47
|
-
- fv: Reference to the Ginga (reference viewer) shell.
|
|
48
|
-
- fitsimage: Reference to the specific viewer object associated with
|
|
49
|
-
the channel on which the plugin is being invoked.
|
|
50
|
-
"""
|
|
51
|
-
|
|
52
|
-
super(SubFieldPosition, self).__init__(fv, fitsimage)
|
|
53
|
-
|
|
54
|
-
def build_gui(self, container):
|
|
55
|
-
|
|
56
|
-
"""
|
|
57
|
-
When the plugin is activated, a GUI is built and packed into the given
|
|
58
|
-
container. This consists of a plot window, visualising the focal plane
|
|
59
|
-
(with a blue circle indicating the field-of-view) on which the sub-field
|
|
60
|
-
will be drawn (if the required keywords are available in the FITS header),
|
|
61
|
-
and a combobox to switch between coordinate systems (focal-plane coordinates,
|
|
62
|
-
pixel coordinates, and field angles).
|
|
63
|
-
|
|
64
|
-
Args:
|
|
65
|
-
- container: Container in which to pack the GUI.
|
|
66
|
-
"""
|
|
67
|
-
|
|
68
|
-
vbox = Widgets.VBox()
|
|
69
|
-
vbox.set_border_width(1)
|
|
70
|
-
vbox.set_spacing(1)
|
|
71
|
-
|
|
72
|
-
self.focal_plane = FocalPlaneWidgetWithSubField()
|
|
73
|
-
vbox.add_widget(self.focal_plane)
|
|
74
|
-
|
|
75
|
-
captions = [("Close", "button")]
|
|
76
|
-
|
|
77
|
-
w, b = Widgets.build_info(captions, orientation="vertical")
|
|
78
|
-
self.w.update(b)
|
|
79
|
-
|
|
80
|
-
self.w.close_button = b.close
|
|
81
|
-
self.w.close_button.add_callback('activated', lambda w: self.close())
|
|
82
|
-
|
|
83
|
-
vbox.add_widget(w)
|
|
84
|
-
container.add_widget(vbox, stretch=1)
|
|
85
|
-
|
|
86
|
-
self.redo()
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
def redo(self):
|
|
90
|
-
|
|
91
|
-
"""
|
|
92
|
-
Update the plugin when a new FITS file is loaded or a new image is shown in the
|
|
93
|
-
central widget of the image viewer.
|
|
94
|
-
"""
|
|
95
|
-
|
|
96
|
-
current_image = self.channel.get_current_image()
|
|
97
|
-
|
|
98
|
-
# No file loaded -> no action needed
|
|
99
|
-
|
|
100
|
-
if current_image is None:
|
|
101
|
-
|
|
102
|
-
return True
|
|
103
|
-
|
|
104
|
-
# File loaded
|
|
105
|
-
|
|
106
|
-
header = current_image.get_header()
|
|
107
|
-
|
|
108
|
-
ccd_code = header.get_card("CCD_ID")["value"] # CCD code
|
|
109
|
-
zeropoint_row = -header.get_card("CRPIX2")["value"] # Sub-field zeropoint row
|
|
110
|
-
zeropoint_column = -header.get_card("CRPIX1")["value"] # Sub-field zeropoint column
|
|
111
|
-
num_rows = header.get_card("NAXIS2")["value"] # Number of rows in the sub-field
|
|
112
|
-
num_columns = header.get_card("NAXIS1")["value"] # Number of columns in the sub-field
|
|
113
|
-
|
|
114
|
-
self.focal_plane.focal_plane.set_subfield(ccd_code=ccd_code, zeropoint_row=zeropoint_row, zeropoint_column=zeropoint_column, num_rows=num_rows, num_columns=num_columns)
|
|
115
|
-
|
|
116
|
-
def close(self):
|
|
117
|
-
|
|
118
|
-
"""
|
|
119
|
-
Close action (to execute when the "Close" button is pushed).
|
|
120
|
-
"""
|
|
121
|
-
|
|
122
|
-
self.fv.stop_local_plugin(self.chname, str(self))
|
|
123
|
-
|
|
124
|
-
return True
|
|
125
|
-
|
|
126
|
-
def __str__(self):
|
|
127
|
-
|
|
128
|
-
"""
|
|
129
|
-
Returns the string representation of this plugin. This needs to be the small-case
|
|
130
|
-
version of the class name in order for the Ginga reference viewer to pick it up.
|
|
131
|
-
"""
|
|
132
|
-
|
|
133
|
-
return "subfieldposition"
|
egse/lampcontrol/__init__.py
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
from calendar import day_abbr
|
|
2
|
-
import logging
|
|
3
|
-
|
|
4
|
-
from egse.decorators import dynamic_interface
|
|
5
|
-
from egse.device import DeviceInterface
|
|
6
|
-
from egse.proxy import Proxy
|
|
7
|
-
from egse.settings import Settings
|
|
8
|
-
from egse.lampcontrol.beaglebone.beaglebone_devif import BeagleboneDeviceInterface
|
|
9
|
-
from egse.zmq_ser import connect_address
|
|
10
|
-
|
|
11
|
-
logger = logging.getLogger(__name__)
|
|
12
|
-
|
|
13
|
-
CTRL_SETTINGS = Settings.load("BeagleBone Lamp Control Server")
|
|
14
|
-
DEVICE_SETTINGS = Settings.load(filename='beaglebone.yaml')
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class BeagleboneError(Exception):
|
|
18
|
-
pass
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class BeagleboneInterface(DeviceInterface):
|
|
22
|
-
""" BeagleBone GSM controller base class."""
|
|
23
|
-
|
|
24
|
-
@dynamic_interface
|
|
25
|
-
def set_lamp(self, state):
|
|
26
|
-
return NotImplemented
|
|
27
|
-
|
|
28
|
-
@dynamic_interface
|
|
29
|
-
def set_interlock(self, state):
|
|
30
|
-
return NotImplemented
|
|
31
|
-
|
|
32
|
-
@dynamic_interface
|
|
33
|
-
def get_lamp_on(self):
|
|
34
|
-
return NotImplemented
|
|
35
|
-
|
|
36
|
-
@dynamic_interface
|
|
37
|
-
def get_laser_on(self):
|
|
38
|
-
return NotImplemented
|
|
39
|
-
|
|
40
|
-
@dynamic_interface
|
|
41
|
-
def get_lamp_module_fault(self):
|
|
42
|
-
return NotImplemented
|
|
43
|
-
|
|
44
|
-
@dynamic_interface
|
|
45
|
-
def get_controller_fault(self):
|
|
46
|
-
return NotImplemented
|
|
47
|
-
|
|
48
|
-
@dynamic_interface
|
|
49
|
-
def fix_controller_fault(self):
|
|
50
|
-
return NotImplemented
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class BeagleboneSimulator(BeagleboneInterface):
|
|
54
|
-
|
|
55
|
-
def __init__(self):
|
|
56
|
-
self._is_connected = True
|
|
57
|
-
|
|
58
|
-
def is_connected(self):
|
|
59
|
-
return self._is_connected
|
|
60
|
-
|
|
61
|
-
def is_simulator(self):
|
|
62
|
-
return True
|
|
63
|
-
|
|
64
|
-
def connect(self):
|
|
65
|
-
self._is_connected = True
|
|
66
|
-
|
|
67
|
-
def disconnect(self):
|
|
68
|
-
self._is_connected = False
|
|
69
|
-
|
|
70
|
-
def reconnect(self):
|
|
71
|
-
if self.is_connected():
|
|
72
|
-
self.disconnect()
|
|
73
|
-
self.connect()
|
|
74
|
-
|
|
75
|
-
def set_lamp(self, state):
|
|
76
|
-
pass
|
|
77
|
-
|
|
78
|
-
def set_interlock(self, state):
|
|
79
|
-
pass
|
|
80
|
-
|
|
81
|
-
def get_lamp_on(self):
|
|
82
|
-
return 0
|
|
83
|
-
|
|
84
|
-
def get_laser_on(self):
|
|
85
|
-
return 0
|
|
86
|
-
|
|
87
|
-
def get_lamp_module_fault(self):
|
|
88
|
-
return 0
|
|
89
|
-
|
|
90
|
-
def get_controller_fault(self):
|
|
91
|
-
return 0
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
class BeagleboneController(BeagleboneInterface):
|
|
95
|
-
|
|
96
|
-
def __init__(self):
|
|
97
|
-
super().__init__()
|
|
98
|
-
|
|
99
|
-
logger.debug('Initalizing BeagleBone GSM Controller')
|
|
100
|
-
|
|
101
|
-
try:
|
|
102
|
-
self.beaglebone = BeagleboneDeviceInterface()
|
|
103
|
-
self.beaglebone.connect()
|
|
104
|
-
except BeagleboneError as exc:
|
|
105
|
-
logger.warning(f"BeagleboneError caught: Couldn't establish connection ({exc})")
|
|
106
|
-
raise BeagleboneError(
|
|
107
|
-
"Couldn't establish a connection with BeagleBone controller."
|
|
108
|
-
) from exc
|
|
109
|
-
|
|
110
|
-
def is_simulator(self):
|
|
111
|
-
return False
|
|
112
|
-
|
|
113
|
-
def is_connected(self):
|
|
114
|
-
return self.beaglebone.is_connected()
|
|
115
|
-
|
|
116
|
-
def connect(self):
|
|
117
|
-
if not self.beaglebone.is_connected():
|
|
118
|
-
self.beaglebone.connect()
|
|
119
|
-
|
|
120
|
-
def disconnect(self):
|
|
121
|
-
self.beaglebone.disconnect()
|
|
122
|
-
|
|
123
|
-
def reconnect(self):
|
|
124
|
-
self.beaglebone.reconnect()
|
|
125
|
-
|
|
126
|
-
def set_lamp(self, state):
|
|
127
|
-
self.beaglebone.set_lamp(state)
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def set_interlock(self, state):
|
|
131
|
-
self.beaglebone.set_interlock(state)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
def get_lamp_on(self):
|
|
135
|
-
return self.beaglebone.get_lamp_on()
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
def get_laser_on(self):
|
|
139
|
-
return self.beaglebone.get_laser_on()
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def get_lamp_module_fault(self):
|
|
143
|
-
return self.beaglebone.get_lamp_module_fault()
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
def get_controller_fault(self):
|
|
147
|
-
return self.beaglebone.get_controller_fault()
|
|
148
|
-
|
|
149
|
-
def fix_controller_fault(self):
|
|
150
|
-
self.beaglebone.fix_controller_fault()
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
class BeagleboneProxy(Proxy, BeagleboneInterface):
|
|
154
|
-
def __init__(self, protocol=CTRL_SETTINGS.PROTOCOL,
|
|
155
|
-
hostname=CTRL_SETTINGS.HOSTNAME,
|
|
156
|
-
port=CTRL_SETTINGS.COMMANDING_PORT):
|
|
157
|
-
super().__init__(connect_address(protocol, hostname, port))
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
if __name__ == "__main__":
|
|
161
|
-
bbb = BeagleboneProxy()
|
|
162
|
-
|
|
163
|
-
print(f"Lamp state: {bbb.get_lamp_on()}\n"\
|
|
164
|
-
f"Laster state: {bbb.get_laser_on()}\n"\
|
|
165
|
-
f"Module fault: {bbb.get_lamp_module_fault()}\n"\
|
|
166
|
-
f"Controller fault: {bbb.get_controller_fault()}\n")
|
|
167
|
-
bbb.set_lamp(True)
|
|
168
|
-
|
|
169
|
-
while not bbb.get_lamp_on():
|
|
170
|
-
pass
|
|
171
|
-
|
|
172
|
-
while not bbb.get_laser_on():
|
|
173
|
-
pass
|
|
174
|
-
|
|
175
|
-
print(f"Lamp state: {bbb.get_lamp_on()}\n"\
|
|
176
|
-
f"Laster state: {bbb.get_laser_on()}\n"\
|
|
177
|
-
f"Module fault: {bbb.get_lamp_module_fault()}\n"\
|
|
178
|
-
f"Controller fault: {bbb.get_controller_fault()}")
|