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/gui/stripchart.py
DELETED
|
@@ -1,729 +0,0 @@
|
|
|
1
|
-
import sys
|
|
2
|
-
import warnings
|
|
3
|
-
from datetime import datetime
|
|
4
|
-
from datetime import timedelta
|
|
5
|
-
from functools import partial
|
|
6
|
-
|
|
7
|
-
import pyqtgraph as pg
|
|
8
|
-
from PyQt5.QtCore import QDateTime
|
|
9
|
-
from PyQt5.QtCore import QRegExp
|
|
10
|
-
from PyQt5.QtCore import QTime
|
|
11
|
-
from PyQt5.QtCore import QTimer
|
|
12
|
-
from PyQt5.QtGui import QIcon
|
|
13
|
-
from PyQt5.QtGui import QIntValidator
|
|
14
|
-
from PyQt5.QtGui import QPixmap
|
|
15
|
-
from PyQt5.QtGui import QRegExpValidator
|
|
16
|
-
from PyQt5.QtWidgets import QAction
|
|
17
|
-
from PyQt5.QtWidgets import QApplication
|
|
18
|
-
from PyQt5.QtWidgets import QGridLayout
|
|
19
|
-
from PyQt5.QtWidgets import QGroupBox
|
|
20
|
-
from PyQt5.QtWidgets import QLabel
|
|
21
|
-
from PyQt5.QtWidgets import QLineEdit
|
|
22
|
-
from PyQt5.QtWidgets import QMainWindow
|
|
23
|
-
from PyQt5.QtWidgets import QPushButton
|
|
24
|
-
from PyQt5.QtWidgets import QSizePolicy
|
|
25
|
-
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
|
|
26
|
-
from matplotlib.dates import DateFormatter
|
|
27
|
-
from matplotlib.figure import Figure
|
|
28
|
-
from pyqtgraph import AxisItem
|
|
29
|
-
from pyqtgraph import PlotWidget
|
|
30
|
-
|
|
31
|
-
from egse.config import find_file
|
|
32
|
-
from egse.process import ProcessStatus
|
|
33
|
-
from egse.randomwalk import RandomWalk
|
|
34
|
-
|
|
35
|
-
warnings.filterwarnings("ignore")
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def cut_range(x, y, interval):
|
|
43
|
-
|
|
44
|
-
"""
|
|
45
|
-
Limit the elements in both lists such that the x-range is not larger
|
|
46
|
-
than interval. The lists are shortened from the start.
|
|
47
|
-
|
|
48
|
-
Given two lists of equal length, shorten the lists such that the elements
|
|
49
|
-
in the x-list all fall within the range x[-1] - interval. The function is
|
|
50
|
-
used to simulate a moving window of size interval.
|
|
51
|
-
|
|
52
|
-
Args:
|
|
53
|
-
- x: List of x-values in ascending order.
|
|
54
|
-
- y: List of corresponding y-values.
|
|
55
|
-
- interval: Range of x-value to crop to.
|
|
56
|
-
|
|
57
|
-
Returns:
|
|
58
|
-
- Cropped x-list.
|
|
59
|
-
- Cropped y-list.
|
|
60
|
-
"""
|
|
61
|
-
|
|
62
|
-
x_min = x[-1] - interval
|
|
63
|
-
idx = next(a[0] for a in enumerate(x) if a[1] >= x_min)
|
|
64
|
-
|
|
65
|
-
return x[idx:], y[idx:]
|
|
66
|
-
|
|
67
|
-
def cut_interval(x, y, start_time, end_time):
|
|
68
|
-
|
|
69
|
-
"""
|
|
70
|
-
Limit the elements in both lists such that the x-values are in the given interval.
|
|
71
|
-
|
|
72
|
-
Given two lists of equal lenght, shorten the lists such that the elements in the x-list
|
|
73
|
-
are within the given interval.
|
|
74
|
-
|
|
75
|
-
Args:
|
|
76
|
-
- x: List of x-values in ascending order.
|
|
77
|
-
- y: List of corresponding y-values.
|
|
78
|
-
- start_time: Minimum x-value to include in the cropped lists.
|
|
79
|
-
- end_time: Maximum x-value to include in the cropped lists.
|
|
80
|
-
|
|
81
|
-
Returns:
|
|
82
|
-
- Cropped x-list.
|
|
83
|
-
- Cropped y-list.
|
|
84
|
-
"""
|
|
85
|
-
|
|
86
|
-
print(type(start_time), type(end_time), type(x[0]))
|
|
87
|
-
idx = next(a[0] for a in enumerate(x) if a[1] >= start_time and a[1] < end_time)
|
|
88
|
-
|
|
89
|
-
return x[idx:], y[idx:]
|
|
90
|
-
|
|
91
|
-
def link(stripchart_widget, stripchart_controller):
|
|
92
|
-
|
|
93
|
-
"""
|
|
94
|
-
Link the given stripchart widget with the given controller. This means the
|
|
95
|
-
following:
|
|
96
|
-
|
|
97
|
-
- the stripchart widget "knows" about the stripchart controller and will update
|
|
98
|
-
the information that is shown there;
|
|
99
|
-
- the stripchart controller "knows" about the stripchart widget and controls what
|
|
100
|
-
is shown.
|
|
101
|
-
"""
|
|
102
|
-
|
|
103
|
-
stripchart_widget.controller = stripchart_controller
|
|
104
|
-
stripchart_controller.stripcharts.append(stripchart_widget)
|
|
105
|
-
|
|
106
|
-
if stripchart_controller.toolbar_mode:
|
|
107
|
-
|
|
108
|
-
stripchart_controller.play_action.triggered.connect(stripchart_widget.play) # Action to put into the toolbar of the main GUI
|
|
109
|
-
|
|
110
|
-
else:
|
|
111
|
-
|
|
112
|
-
stripchart_controller.play_button.clicked.connect(stripchart_widget.play) # Play button in the controller widget
|
|
113
|
-
|
|
114
|
-
class StripChartControllerWidget(QGroupBox):
|
|
115
|
-
|
|
116
|
-
"""
|
|
117
|
-
Displays the begin and end of the time range that will be shown in the stripchart widgets
|
|
118
|
-
that are linked to this stripchart controller (in the format "d hh:mm:ss"), and the corresponding
|
|
119
|
-
interval length (in seconds).
|
|
120
|
-
|
|
121
|
-
You can choose to display either:
|
|
122
|
-
|
|
123
|
-
- the last interval (of given duration) of the time series
|
|
124
|
-
- or a specific period in time (from the given start to end time).
|
|
125
|
-
|
|
126
|
-
This can be chosen in two different way (you have to pick one):
|
|
127
|
-
|
|
128
|
-
- via a button in the stripchart controller widget
|
|
129
|
-
- or via a button/action that can be placed in the toolbar of the main GUI.
|
|
130
|
-
|
|
131
|
-
If the button of choice is in "play" mode, the last time interval will be shown, the
|
|
132
|
-
length of which can be specified (in seconds) in the text field in the controller widget. The
|
|
133
|
-
start and end time of this time period is also displayed (but cannot be changed).
|
|
134
|
-
Alternatively, if the button of choice is in "pause" mode, the plot is no longer updated
|
|
135
|
-
in realtime, but you can specify which time period to inspect, by adapting the start and end
|
|
136
|
-
time (in the format "d hh:mm:ss"). The interval lengths is also displayed (but cannot be
|
|
137
|
-
changed).
|
|
138
|
-
"""
|
|
139
|
-
|
|
140
|
-
def __init__(self, toolbar_mode=True):
|
|
141
|
-
|
|
142
|
-
super(StripChartControllerWidget, self).__init__("")
|
|
143
|
-
|
|
144
|
-
self.stripcharts = []
|
|
145
|
-
self.realtime = True
|
|
146
|
-
|
|
147
|
-
self.toolbar_mode = toolbar_mode
|
|
148
|
-
|
|
149
|
-
if toolbar_mode:
|
|
150
|
-
|
|
151
|
-
self.create_play_action()
|
|
152
|
-
|
|
153
|
-
layout = QGridLayout()
|
|
154
|
-
|
|
155
|
-
# Button: play/pause
|
|
156
|
-
|
|
157
|
-
if not toolbar_mode:
|
|
158
|
-
|
|
159
|
-
self.create_play_button()
|
|
160
|
-
layout.addWidget(self.play_button, 0, 0)
|
|
161
|
-
|
|
162
|
-
# From ... to ...
|
|
163
|
-
|
|
164
|
-
self.create_start_end()
|
|
165
|
-
|
|
166
|
-
layout.addWidget(QLabel("From"), 1, 1)
|
|
167
|
-
layout.addWidget(self.start_time_label, 1, 2)
|
|
168
|
-
layout.addWidget(QLabel("to"), 1, 3)
|
|
169
|
-
layout.addWidget(self.end_time_label, 1, 4)
|
|
170
|
-
|
|
171
|
-
# Interval length
|
|
172
|
-
|
|
173
|
-
self.create_interval()
|
|
174
|
-
|
|
175
|
-
layout.addWidget(QLabel("Interval [s]"), 2, 1)
|
|
176
|
-
layout.addWidget(self.interval_label, 2, 2)
|
|
177
|
-
|
|
178
|
-
self.setLayout(layout)
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
def create_play_action(self):
|
|
182
|
-
|
|
183
|
-
"""
|
|
184
|
-
Create play button/action that will be added to the toolbar of the main GUI. When this button
|
|
185
|
-
is pushed, the behaviour of the plots of the stripcharts changes accordingly.
|
|
186
|
-
"""
|
|
187
|
-
|
|
188
|
-
play_pix = QPixmap(str(find_file("play.png", in_dir="images")))
|
|
189
|
-
pause_pix = QPixmap(str(find_file("pause.png", in_dir="images")))
|
|
190
|
-
play_icon = QIcon()
|
|
191
|
-
play_icon.addPixmap(play_pix, QIcon.Normal, QIcon.On)
|
|
192
|
-
play_icon.addPixmap(pause_pix, QIcon.Normal, QIcon.Off)
|
|
193
|
-
|
|
194
|
-
self.play_action = QAction(play_icon, "Play", self)
|
|
195
|
-
self.play_action.setToolTip("Sohw specific time interval / show last time interval")
|
|
196
|
-
self.play_action.setCheckable(True)
|
|
197
|
-
self.play_action.setChecked(False)
|
|
198
|
-
self.play_action.triggered.connect(self.handle_play)
|
|
199
|
-
|
|
200
|
-
def create_play_button(self):
|
|
201
|
-
|
|
202
|
-
"""
|
|
203
|
-
Create play button that will be added to the stripchart controller. When this button is
|
|
204
|
-
pushed, the behaviour of the plots of the stripcharts changes accordingly.
|
|
205
|
-
"""
|
|
206
|
-
|
|
207
|
-
self.play_icon = QIcon(str(find_file("play.png", in_dir="images")))
|
|
208
|
-
self.pause_icon = QIcon(str(find_file("pause.png", in_dir="images")))
|
|
209
|
-
|
|
210
|
-
self.play_button = QPushButton("")
|
|
211
|
-
self.play_button.setToolTip("Show specific time interval")
|
|
212
|
-
self.play_button.setIcon(self.pause_icon)
|
|
213
|
-
self.play_button.clicked.connect(self.play)
|
|
214
|
-
|
|
215
|
-
def create_start_end(self):
|
|
216
|
-
|
|
217
|
-
"""
|
|
218
|
-
Create the text fields (incl. validators) for the start and end time.
|
|
219
|
-
|
|
220
|
-
Currently, the validator is not set for the text fields, as the values are not accepted then
|
|
221
|
-
when you hit enter. Still to figure out what the problem is.
|
|
222
|
-
"""
|
|
223
|
-
|
|
224
|
-
time_regex = QRegExp('^([1-9]|[1-9]\d{1,}) ^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$')
|
|
225
|
-
time_validator = QRegExpValidator(time_regex)
|
|
226
|
-
|
|
227
|
-
# Start time
|
|
228
|
-
|
|
229
|
-
self.start_time_label = QLineEdit(self)
|
|
230
|
-
self.start_time_label.setReadOnly(True)
|
|
231
|
-
|
|
232
|
-
# self.start_time_label.setValidator(time_validator)
|
|
233
|
-
self.start_time_label.setPlaceholderText("d hh:mm:ss")
|
|
234
|
-
self.start_time_label.returnPressed.connect(partial(self.update_start_time, self.start_time_label))
|
|
235
|
-
|
|
236
|
-
self.end_time_label = QLineEdit(self)
|
|
237
|
-
self.end_time_label.setReadOnly(True)
|
|
238
|
-
|
|
239
|
-
# self.end_time_label.setValidator(time_validator)
|
|
240
|
-
self.end_time_label.setPlaceholderText("d hh:mm:ss")
|
|
241
|
-
self.end_time_label.returnPressed.connect(partial(self.update_end_time, self.end_time_label))
|
|
242
|
-
|
|
243
|
-
def create_interval(self):
|
|
244
|
-
|
|
245
|
-
"""
|
|
246
|
-
Create the text field for the interval length.
|
|
247
|
-
"""
|
|
248
|
-
self.interval_label = QLineEdit(self)
|
|
249
|
-
|
|
250
|
-
interval_validator = QIntValidator()
|
|
251
|
-
interval_validator.setBottom(1)
|
|
252
|
-
self.interval_label.setValidator(interval_validator)
|
|
253
|
-
|
|
254
|
-
self.interval = timedelta(seconds=60)
|
|
255
|
-
|
|
256
|
-
self.interval_label.setText(str(self.interval.seconds))
|
|
257
|
-
self.interval_label.returnPressed.connect(partial(self.update_interval, self.interval_label))
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
def handle_play(self):
|
|
261
|
-
|
|
262
|
-
"""
|
|
263
|
-
When the play button in the toolbar of the main GUI is pushed (if any), the behaviour of the (plots in the)
|
|
264
|
-
stripchart widget changes.
|
|
265
|
-
|
|
266
|
-
In realtime mode (real stripchart):
|
|
267
|
-
- the play-button in the stripchart controller (if any) should show the "pause" icon;
|
|
268
|
-
- the plot is updated immediately when an extra datapoint is added to the time series;
|
|
269
|
-
- the textfields in the stripchart controller (if any) with the start and end time cannot be
|
|
270
|
-
changed by the user but will be updated automatically;
|
|
271
|
-
- the interval length can be adapted via the dedicated text field in the stripchart controller (if any).
|
|
272
|
-
|
|
273
|
-
In non-realtime mode (inspection of a specific time period):
|
|
274
|
-
- the play-button in the stripchart controller (if any) should show the "play" icon;
|
|
275
|
-
- the plot is no longer updated when an extra datapoint is added to the time series;
|
|
276
|
-
- the start and end time can be adapted via the dedicated text fields in the stripchart
|
|
277
|
-
controller (if any);
|
|
278
|
-
- the textfield in the stripchart controller (if any) with the interval length cannot be
|
|
279
|
-
changed by the user but will be updated automatically (when returning to realtime mode,
|
|
280
|
-
this new interval length will be used).
|
|
281
|
-
"""
|
|
282
|
-
|
|
283
|
-
self.play()
|
|
284
|
-
|
|
285
|
-
def play(self):
|
|
286
|
-
|
|
287
|
-
"""
|
|
288
|
-
When the play button is pushed in the stripchart controller (if any), the behaviour of the (plots in the)
|
|
289
|
-
stripchart widget changes.
|
|
290
|
-
|
|
291
|
-
In realtime mode (real stripchart):
|
|
292
|
-
- the play-button in the stripchart controller (if any) should show the "pause" icon;
|
|
293
|
-
- the plot is updated immediately when an extra datapoint is added to the time series;
|
|
294
|
-
- the textfields in the stripchart controller (if any) with the start and end time cannot be
|
|
295
|
-
changed by the user but will be updated automatically;
|
|
296
|
-
- the interval length can be adapted via the dedicated text field in the stripchart controller (if any).
|
|
297
|
-
|
|
298
|
-
In non-realtime mode (inspection of a specific time period):
|
|
299
|
-
- the play-button in the stripchart controller (if any) should show the "play" icon;
|
|
300
|
-
- the plot is no longer updated when an extra datapoint is added to the time series;
|
|
301
|
-
- the start and end time can be adapted via the dedicated text fields in the stripchart
|
|
302
|
-
controller (if any);
|
|
303
|
-
- the textfield in the stripchart controller (if any) with the interval length cannot be
|
|
304
|
-
changed by the user but will be updated automatically (when returning to realtime mode,
|
|
305
|
-
this new interval length will be used).
|
|
306
|
-
"""
|
|
307
|
-
|
|
308
|
-
self.realtime = not self.realtime
|
|
309
|
-
|
|
310
|
-
# Realtime mode
|
|
311
|
-
|
|
312
|
-
if self.realtime:
|
|
313
|
-
|
|
314
|
-
if not self.toolbar_mode:
|
|
315
|
-
|
|
316
|
-
self.play_button.setIcon(self.pause_icon) # Change the icon on the play-button to "pause"
|
|
317
|
-
self.play_button.setToolTip("Show specific time interval")
|
|
318
|
-
self.play_button.repaint()
|
|
319
|
-
|
|
320
|
-
self.start_time_label.setReadOnly(True) # Disable changing the start time text field
|
|
321
|
-
self.end_time_label.setReadOnly(True) # Disable changing the start time text field
|
|
322
|
-
self.interval_label.setReadOnly(False) # Enable changing the interval length
|
|
323
|
-
|
|
324
|
-
# Non-realtime mode
|
|
325
|
-
|
|
326
|
-
else:
|
|
327
|
-
|
|
328
|
-
if not self.toolbar_mode:
|
|
329
|
-
|
|
330
|
-
self.play_button.setIcon(self.play_icon) # Change the icon on the play-button to "play"
|
|
331
|
-
self.play_button.setToolTip("Show last time interval")
|
|
332
|
-
self.play_button.repaint()
|
|
333
|
-
|
|
334
|
-
self.start_time_label.setReadOnly(False) # Enable changing the start time text field
|
|
335
|
-
self.end_time_label.setReadOnly(False) # Enable changing the start time text field
|
|
336
|
-
self.interval_label.setReadOnly(True) # Disable changing the interval length
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
def update_interval(self, interval_label):
|
|
340
|
-
|
|
341
|
-
"""
|
|
342
|
-
If the text field with the interval length is updated, the plots in the stripchart
|
|
343
|
-
widgets are updated. Only applicable in realtime mode.
|
|
344
|
-
|
|
345
|
-
Args:
|
|
346
|
-
- interval_label: Text field where the interval length can be entered (in seconds).
|
|
347
|
-
"""
|
|
348
|
-
|
|
349
|
-
self.interval = timedelta(seconds=int(interval_label.text()))
|
|
350
|
-
|
|
351
|
-
# Update all stripchart widgets
|
|
352
|
-
|
|
353
|
-
for stripchart in self.stripcharts:
|
|
354
|
-
|
|
355
|
-
stripchart.update_interval(self.interval)
|
|
356
|
-
|
|
357
|
-
def update_start_time(self, start_time_label):
|
|
358
|
-
|
|
359
|
-
"""
|
|
360
|
-
If the text field with the start time is updated, the plots in the stripchart widgets
|
|
361
|
-
are updated. Only applicable in non-realtime mode.
|
|
362
|
-
|
|
363
|
-
Args:
|
|
364
|
-
- start_time_label: Text field where the start time can be entered (in format "d hh:mm:ss").
|
|
365
|
-
"""
|
|
366
|
-
|
|
367
|
-
start_time = datetime.strptime(start_time_label.text(), "%j %H:%M:%S")
|
|
368
|
-
start_time += timedelta(days=365.25*70-1, hours=12) # 1900 -> 1970
|
|
369
|
-
|
|
370
|
-
# Update all stripchart widgets
|
|
371
|
-
|
|
372
|
-
for stripchart in self.stripcharts:
|
|
373
|
-
|
|
374
|
-
stripchart.update_start_time(start_time)
|
|
375
|
-
|
|
376
|
-
def update_end_time(self, end_time_label):
|
|
377
|
-
|
|
378
|
-
"""
|
|
379
|
-
If the text field with the end time is updated, the plots in the stripchart widgets
|
|
380
|
-
are updated. Only applicable in non-realtime mode.
|
|
381
|
-
|
|
382
|
-
Args:
|
|
383
|
-
- end_time_label: Text field where the end time can be entered (in format "d hh:mm:ss").
|
|
384
|
-
"""
|
|
385
|
-
|
|
386
|
-
end_time = datetime.strptime(end_time_label.text(), "%j %H:%M:%S")
|
|
387
|
-
end_time += timedelta(days=365.25*70 - 1, hours=12) # 1900 -> 1970
|
|
388
|
-
|
|
389
|
-
# Update all stripchart widgets
|
|
390
|
-
|
|
391
|
-
for stripchart in self.stripcharts:
|
|
392
|
-
|
|
393
|
-
stripchart.update_end_time(end_time)
|
|
394
|
-
|
|
395
|
-
def set_time(self, last_timepoint):
|
|
396
|
-
|
|
397
|
-
"""
|
|
398
|
-
Update the content of the textfields with the start and end time (in realtime mode only).
|
|
399
|
-
Only applicable in realtime mode.
|
|
400
|
-
"""
|
|
401
|
-
|
|
402
|
-
self.end_time_label.setText(last_timepoint.strftime("%-d %H:%M:%S"))
|
|
403
|
-
self.start_time_label.setText((last_timepoint - self.interval).strftime("%-d %H:%M:%S"))
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
class StripChartWidget(QGroupBox):
|
|
407
|
-
|
|
408
|
-
def __init__(self, quantity, unit):
|
|
409
|
-
|
|
410
|
-
"""
|
|
411
|
-
Initialisation of a plot of the focal plane, with a blue circle indicating the
|
|
412
|
-
field-of-view. Below the plot you can find a spinner to choose the coordinate
|
|
413
|
-
system to be used in the plot.
|
|
414
|
-
|
|
415
|
-
Args:
|
|
416
|
-
- quantity: Physical quantity shown by the strip chart.
|
|
417
|
-
- unit: Unit of the physical quantity shown by the strip chart.
|
|
418
|
-
"""
|
|
419
|
-
|
|
420
|
-
super(StripChartWidget, self).__init__("")
|
|
421
|
-
|
|
422
|
-
self.interval = timedelta(seconds=60)
|
|
423
|
-
|
|
424
|
-
self.realtime = True
|
|
425
|
-
self.controller = None
|
|
426
|
-
|
|
427
|
-
self.timepoints = []
|
|
428
|
-
self.values = []
|
|
429
|
-
|
|
430
|
-
# Plot window
|
|
431
|
-
|
|
432
|
-
layout = QGridLayout()
|
|
433
|
-
|
|
434
|
-
self.stripchart = TimeSeriesCanvas(quantity, unit)
|
|
435
|
-
|
|
436
|
-
layout.addWidget(self.stripchart)
|
|
437
|
-
|
|
438
|
-
self.setLayout(layout)
|
|
439
|
-
|
|
440
|
-
def update(self, time, value):
|
|
441
|
-
|
|
442
|
-
"""
|
|
443
|
-
Update the plot when the given datapoint is added to the time series, only when in realtime
|
|
444
|
-
mode.
|
|
445
|
-
|
|
446
|
-
Args:
|
|
447
|
-
- time: Time [ms].
|
|
448
|
-
- value: Value.
|
|
449
|
-
"""
|
|
450
|
-
|
|
451
|
-
# Convert from double to datetime
|
|
452
|
-
|
|
453
|
-
time = datetime.fromtimestamp(time / 1000.0)
|
|
454
|
-
|
|
455
|
-
# Append to the time series
|
|
456
|
-
|
|
457
|
-
self.timepoints.append(time)
|
|
458
|
-
self.values.append(value)
|
|
459
|
-
|
|
460
|
-
# Update the plot (only in realtime mode)
|
|
461
|
-
|
|
462
|
-
if self.realtime:
|
|
463
|
-
|
|
464
|
-
self.end_time = self.timepoints[-1] # New point = new end time
|
|
465
|
-
self.start_time = self.end_time - self.interval # Update start time
|
|
466
|
-
|
|
467
|
-
last_timepoints, last_values = cut_range(self.timepoints, self.values, self.interval) # Cut out the requested range
|
|
468
|
-
self.stripchart.plot(last_timepoints, last_values, interval=self.interval) # Update the plot
|
|
469
|
-
|
|
470
|
-
if not self.controller is None:
|
|
471
|
-
|
|
472
|
-
self.controller.set_time(last_timepoints[-1]) # Update the text fields in the stripchart controller (begin and end time)
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
def update_interval(self, interval):
|
|
477
|
-
|
|
478
|
-
"""
|
|
479
|
-
When the text field with the interval is updated in the stripchart controller (if any),
|
|
480
|
-
the range on the x-axis of the plot is adapted accordingly.
|
|
481
|
-
|
|
482
|
-
Args:
|
|
483
|
-
- interval: Length of the time period to be displayed in the plot [s].
|
|
484
|
-
"""
|
|
485
|
-
|
|
486
|
-
self.interval = interval
|
|
487
|
-
|
|
488
|
-
last_timepoints, lastvalues = cut_range(self.timepoints, self.values, self.interval)
|
|
489
|
-
self.stripchart.plot(last_timepoints, lastvalues, interval=self.interval)
|
|
490
|
-
|
|
491
|
-
def update_start_time(self, start_time):
|
|
492
|
-
|
|
493
|
-
"""
|
|
494
|
-
When the text field with the start time is updated in the stripchart controller (if any),
|
|
495
|
-
the range on the x-axis of the plot is adapted accordingly.
|
|
496
|
-
|
|
497
|
-
Args:
|
|
498
|
-
- start_time: First timepoint to be displayed in the plot (in the format "d hh:mm:ss").
|
|
499
|
-
"""
|
|
500
|
-
|
|
501
|
-
self.start_time = start_time
|
|
502
|
-
|
|
503
|
-
self.interval = self.end_time.replace(microsecond=0) - self.start_time.replace(microsecond=0)
|
|
504
|
-
|
|
505
|
-
self.controller.interval_label.setText(str(self.interval.seconds))
|
|
506
|
-
|
|
507
|
-
t, v = cut_interval(self.timepoints, self.values, self.start_time, self.end_time)
|
|
508
|
-
self.stripchart.plot(t, v, min_time=self.start_time, max_time=self.end_time)
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
def update_end_time(self, end_time):
|
|
513
|
-
|
|
514
|
-
"""
|
|
515
|
-
When the text field with the end time is updated in the stripchart controller (if any),
|
|
516
|
-
the range on the x-axis of the plot is adapted accordingly.
|
|
517
|
-
|
|
518
|
-
Args:
|
|
519
|
-
- end_time: Last timepoint to be displayed in the plot (in the format "d hh:mm:ss").
|
|
520
|
-
"""
|
|
521
|
-
|
|
522
|
-
self.end_time = end_time
|
|
523
|
-
|
|
524
|
-
self.interval = self.end_time.replace(microsecond=0) - self.start_time.replace(microsecond=0)
|
|
525
|
-
|
|
526
|
-
self.controller.interval_label.setText(str(self.interval.seconds))
|
|
527
|
-
|
|
528
|
-
t, v = cut_interval(self.timepoints, self.values, self.start_time, self.end_time)
|
|
529
|
-
self.stripchart.plot(t, v, min_time=self.start_time, max_time=self.end_time)
|
|
530
|
-
|
|
531
|
-
def play(self):
|
|
532
|
-
|
|
533
|
-
"""
|
|
534
|
-
When the play button from the stripchart controller (if any) is pushed, the widget is notified
|
|
535
|
-
that the display behaviour (realtime update of the last interval vs. inspecting specific period)
|
|
536
|
-
must change.
|
|
537
|
-
"""
|
|
538
|
-
|
|
539
|
-
self.realtime = not self.realtime
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
class TimeSeriesCanvas(FigureCanvas):
|
|
546
|
-
|
|
547
|
-
def __init__(self, quantity, unit, parent=None, dpi=100):
|
|
548
|
-
|
|
549
|
-
"""
|
|
550
|
-
Initialisation of the plot window, that will be used to plot time series.
|
|
551
|
-
|
|
552
|
-
Args:
|
|
553
|
-
- quantity: Physical quantity that will be shown on the y-axis.
|
|
554
|
-
- unit: Unit of the physical quantity that will be shown on the y-axis.
|
|
555
|
-
"""
|
|
556
|
-
|
|
557
|
-
self.quantity = quantity
|
|
558
|
-
self.unit = unit
|
|
559
|
-
|
|
560
|
-
self.figure = Figure()
|
|
561
|
-
self.ax = self.figure.add_subplot(111)
|
|
562
|
-
|
|
563
|
-
FigureCanvas.__init__(self, self.figure)
|
|
564
|
-
self.setParent(parent)
|
|
565
|
-
|
|
566
|
-
FigureCanvas.setSizePolicy(
|
|
567
|
-
self, QSizePolicy.Expanding, QSizePolicy.Expanding)
|
|
568
|
-
FigureCanvas.updateGeometry(self)
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
def plot(self, timepoints, values, interval=None, min_time = None, max_time = None):
|
|
572
|
-
|
|
573
|
-
"""
|
|
574
|
-
Remove the current content (if any) and plot the given data.
|
|
575
|
-
|
|
576
|
-
Args:
|
|
577
|
-
- timepoints: Timepoints as datatime objects.
|
|
578
|
-
- values: Values corresponding to the timepoints.
|
|
579
|
-
- interval: Range of the x-axis (up to the last timepoints) as timedelta object. If this
|
|
580
|
-
is None, the x-range will not be set.
|
|
581
|
-
- min_time: Lower end of the interval to show on the x-axis.
|
|
582
|
-
- max_time: Upper end of the interval to show on the x-axis.
|
|
583
|
-
"""
|
|
584
|
-
|
|
585
|
-
# Remove old content (if any)
|
|
586
|
-
|
|
587
|
-
try:
|
|
588
|
-
del self.ax.lines[-1]
|
|
589
|
-
except:
|
|
590
|
-
pass
|
|
591
|
-
|
|
592
|
-
# Plot the new data
|
|
593
|
-
|
|
594
|
-
self.ax.plot(timepoints, values, "b")
|
|
595
|
-
|
|
596
|
-
# On the x-axis: time
|
|
597
|
-
|
|
598
|
-
if not interval is None:
|
|
599
|
-
|
|
600
|
-
self.ax.set_xlim([timepoints[-1] - interval, timepoints[-1]])
|
|
601
|
-
|
|
602
|
-
if not min_time is None and not max_time is None:
|
|
603
|
-
|
|
604
|
-
self.ax.set_xlim([min_time, max_time])
|
|
605
|
-
|
|
606
|
-
self.ax.set_xlabel("Time [d hh:mm:ss]", fontsize=10)
|
|
607
|
-
formatter = DateFormatter("%-d %H:%M:%S")
|
|
608
|
-
self.ax.xaxis.set_major_formatter(formatter)
|
|
609
|
-
self.figure.autofmt_xdate()
|
|
610
|
-
|
|
611
|
-
# On the y-axis: physical quantity (specified at initialisation)
|
|
612
|
-
|
|
613
|
-
self.ax.set_ylabel(self.quantity + " [" + self.unit + "]", fontsize=10)
|
|
614
|
-
|
|
615
|
-
self.draw()
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
class TimeAxisItem(AxisItem):
|
|
621
|
-
def __init__(self, *args, **kwargs):
|
|
622
|
-
AxisItem.__init__(self, *args, **kwargs)
|
|
623
|
-
|
|
624
|
-
def tickStrings(self, values, scale, spacing):
|
|
625
|
-
return [QDateTime.fromMSecsSinceEpoch(value).toString('d HH:mm:ss') for value in values]
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
class StripChart(PlotWidget):
|
|
629
|
-
"""
|
|
630
|
-
A PlotWidget that represents a StripChart (scatter plot).
|
|
631
|
-
By default the bottom axis is a time axis in milliseconds resolution, but
|
|
632
|
-
the labels are 'hh:mm:ss' since midnight.
|
|
633
|
-
By default the left axis is a Position in degrees.
|
|
634
|
-
The default can be changed by using the `axisItems` and `labels` arguments
|
|
635
|
-
as in the following example:
|
|
636
|
-
```
|
|
637
|
-
stripchart = StripChart(
|
|
638
|
-
axisItems={'bottom': AxisItem(orientation='bottom')},
|
|
639
|
-
labels={'left' : ('Position', 'millimeter'),
|
|
640
|
-
'bottom': ('Index', None)})
|
|
641
|
-
```
|
|
642
|
-
"""
|
|
643
|
-
def __init__(self, **kwargs):
|
|
644
|
-
if 'axisItems' not in kwargs:
|
|
645
|
-
bottom_axis = TimeAxisItem(orientation='bottom')
|
|
646
|
-
left_axis = AxisItem(orientation='left')
|
|
647
|
-
|
|
648
|
-
# Disable automatic prefix for SI units and axis scaling
|
|
649
|
-
bottom_axis.enableAutoSIPrefix(enable=False)
|
|
650
|
-
left_axis.enableAutoSIPrefix(enable=False)
|
|
651
|
-
|
|
652
|
-
kwargs['axisItems'] = {'bottom': bottom_axis, 'left': left_axis}
|
|
653
|
-
|
|
654
|
-
PlotWidget.__init__(self, **kwargs)
|
|
655
|
-
|
|
656
|
-
if 'labels' not in kwargs:
|
|
657
|
-
self.setLabel('left', 'Position', units='degrees')
|
|
658
|
-
self.setLabel('bottom', 'Time', units='d hh:mm:ss')
|
|
659
|
-
|
|
660
|
-
self._plot = self.plot(pen=pg.mkPen(width=4))
|
|
661
|
-
self._x_time = []
|
|
662
|
-
self._y_data = []
|
|
663
|
-
self._interval = 60 * 60 # [s] number of seconds on the bottom axis
|
|
664
|
-
|
|
665
|
-
def setInterval(self, interval):
|
|
666
|
-
"""
|
|
667
|
-
Set the interval for the x-axis.
|
|
668
|
-
Time intervals are in seconds.
|
|
669
|
-
"""
|
|
670
|
-
self._interval = interval
|
|
671
|
-
|
|
672
|
-
def setData(self, *args, **kwargs):
|
|
673
|
-
self._plot.setData(*args, **kwargs)
|
|
674
|
-
|
|
675
|
-
def set_yrange(self, ymin, ymax):
|
|
676
|
-
self.setYRange(ymax, ymin)
|
|
677
|
-
|
|
678
|
-
def update(self, time, value):
|
|
679
|
-
|
|
680
|
-
self._x_time.append(time)
|
|
681
|
-
self._y_data.append(value)
|
|
682
|
-
|
|
683
|
-
# We are not cutting the original data, that keeps on growing for the
|
|
684
|
-
# lifetime of the stripchart object. The reason is because we might want
|
|
685
|
-
# to implement panning back and forth in time at some point.
|
|
686
|
-
#
|
|
687
|
-
# x is in milliseconds, so interval shall also be in miliseconds
|
|
688
|
-
|
|
689
|
-
x, y = cut_range(self._x_time, self._y_data, self._interval * 1000)
|
|
690
|
-
|
|
691
|
-
self._plot.setData(x, y)
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
if __name__ == "__main__":
|
|
695
|
-
|
|
696
|
-
class MainWindow(QMainWindow):
|
|
697
|
-
def __init__(self):
|
|
698
|
-
super().__init__()
|
|
699
|
-
self.stripchart = StripChart()
|
|
700
|
-
self.random_walk = RandomWalk(scale=0.1, count=0)
|
|
701
|
-
self.process_status = ProcessStatus()
|
|
702
|
-
|
|
703
|
-
self.setCentralWidget(self.stripchart)
|
|
704
|
-
|
|
705
|
-
self.stripchart_timer = QTimer()
|
|
706
|
-
self.stripchart_timer.timeout.connect(self.update_stripchart)
|
|
707
|
-
self.stripchart_timer.setInterval(100)
|
|
708
|
-
self.stripchart_timer.start()
|
|
709
|
-
|
|
710
|
-
self.reporting_timer = QTimer()
|
|
711
|
-
self.reporting_timer.timeout.connect(self.report_system_resources)
|
|
712
|
-
self.reporting_timer.setInterval(10_000)
|
|
713
|
-
self.reporting_timer.start()
|
|
714
|
-
|
|
715
|
-
def update_stripchart(self):
|
|
716
|
-
# current_time = datetime.now()
|
|
717
|
-
current_time = QTime.currentTime().msecsSinceStartOfDay()
|
|
718
|
-
value = next(self.random_walk)
|
|
719
|
-
self.stripchart.update(current_time, value)
|
|
720
|
-
|
|
721
|
-
def report_system_resources(self):
|
|
722
|
-
print(self.process_status)
|
|
723
|
-
|
|
724
|
-
app = QApplication([])
|
|
725
|
-
|
|
726
|
-
window = MainWindow()
|
|
727
|
-
window.show()
|
|
728
|
-
|
|
729
|
-
sys.exit(app.exec())
|