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/dpu/dpu.py
DELETED
|
@@ -1,783 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module contains commanding functions that are used by the DPU Controller / Processor.
|
|
3
|
-
|
|
4
|
-
The commanding functions (starting with `command_`) are put on the command_queue by the
|
|
5
|
-
DPUController when a user executes a DPU command. The DPU processor picks up the command from the
|
|
6
|
-
queue and executes the command in the RMAP commanding window, i.e. when the N-FEE is ready to
|
|
7
|
-
accept RMAP commands. All these commands shall start with `command_`.
|
|
8
|
-
|
|
9
|
-
There are also priority commands which are treated different by the DPU processor. The DPU
|
|
10
|
-
processor executes the priority commands also outside the RMAP window. Priority commands can
|
|
11
|
-
either act only within the context of the DPU processor, i.e. return a register value without
|
|
12
|
-
consulting the N-FEE, or special RMAP commands can also be sent to the N-FEE outside the normal
|
|
13
|
-
RMAP window. An example of the latter is the _Immediate ON_ mode. These commands shall all start
|
|
14
|
-
with `prio_command_`.
|
|
15
|
-
|
|
16
|
-
"""
|
|
17
|
-
import logging
|
|
18
|
-
from collections import namedtuple
|
|
19
|
-
from typing import Optional
|
|
20
|
-
|
|
21
|
-
from egse.fee import n_fee_mode
|
|
22
|
-
from egse.reg import Register
|
|
23
|
-
from egse.reg import RegisterMap
|
|
24
|
-
from egse.spw import SpaceWireInterface
|
|
25
|
-
from egse.system import Timer
|
|
26
|
-
|
|
27
|
-
MODULE_LOGGER = logging.getLogger(__name__)
|
|
28
|
-
|
|
29
|
-
DEFAULT_CCD_READOUT_ORDER = 0b11100100
|
|
30
|
-
"""The default for pFM -> CCD 1, 2, 3, 4 (reading from the right).
|
|
31
|
-
We use this default value only for going to DUMP mode because there the ccd_readout_order parameter
|
|
32
|
-
is not passed. For all other command functions, the ccd_readout_order is explicitly passed."""
|
|
33
|
-
|
|
34
|
-
SENSOR_SEL_BOTH_SIDES = 3
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
class NFEEState:
|
|
38
|
-
"""
|
|
39
|
-
This class represents the state of the N-FEE FPGA as close as possible in terms of register
|
|
40
|
-
values during the different stages of a readout cycle. The difference between this class and
|
|
41
|
-
the register map is that the register map is updated on RMAP write requests (commands on the
|
|
42
|
-
DPU Processor Queue), while this class is updated on sync pulses from the content of the
|
|
43
|
-
register map. Therefore, the N-FEE Internals represent the actual state, while the register
|
|
44
|
-
map represents the commanded state.
|
|
45
|
-
|
|
46
|
-
The following parameters are tracked by this class:
|
|
47
|
-
|
|
48
|
-
Every long pulse (400ms):
|
|
49
|
-
|
|
50
|
-
* v_start, v_end, h_end, n_final_dump, ccd_mode_config, ccd_readout_order,
|
|
51
|
-
sync_sel, digitise_en, DG_en, int_sync_period
|
|
52
|
-
* sensor_sel, ccd_read_en
|
|
53
|
-
|
|
54
|
-
Every short pulse (200ms):
|
|
55
|
-
|
|
56
|
-
* sensor_sel, ccd_read_en
|
|
57
|
-
"""
|
|
58
|
-
|
|
59
|
-
FIELDS = (
|
|
60
|
-
"v_start",
|
|
61
|
-
"v_end",
|
|
62
|
-
"h_end",
|
|
63
|
-
"n_final_dump",
|
|
64
|
-
"ccd_mode_config",
|
|
65
|
-
"ccd_readout_order",
|
|
66
|
-
"sync_sel",
|
|
67
|
-
"digitise_en",
|
|
68
|
-
"DG_en",
|
|
69
|
-
"int_sync_period",
|
|
70
|
-
"sensor_sel", # also updated on 200ms pulse
|
|
71
|
-
"ccd_read_en", # also updated on 200ms pulse
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
StateTuple = namedtuple("StateTuple", FIELDS)
|
|
75
|
-
|
|
76
|
-
def __init__(self):
|
|
77
|
-
|
|
78
|
-
self._internals = {k: 0 for k in NFEEState.FIELDS}
|
|
79
|
-
|
|
80
|
-
@property
|
|
81
|
-
def v_start(self):
|
|
82
|
-
return self._internals["v_start"]
|
|
83
|
-
|
|
84
|
-
@property
|
|
85
|
-
def v_end(self):
|
|
86
|
-
return self._internals["v_end"]
|
|
87
|
-
|
|
88
|
-
@property
|
|
89
|
-
def h_end(self):
|
|
90
|
-
return self._internals["h_end"]
|
|
91
|
-
|
|
92
|
-
@property
|
|
93
|
-
def n_final_dump(self):
|
|
94
|
-
return self._internals["n_final_dump"]
|
|
95
|
-
|
|
96
|
-
@property
|
|
97
|
-
def ccd_mode_config(self):
|
|
98
|
-
return self._internals["ccd_mode_config"]
|
|
99
|
-
|
|
100
|
-
@property
|
|
101
|
-
def ccd_readout_order(self):
|
|
102
|
-
return self._internals["ccd_readout_order"]
|
|
103
|
-
|
|
104
|
-
@property
|
|
105
|
-
def sync_sel(self):
|
|
106
|
-
return self._internals["sync_sel"]
|
|
107
|
-
|
|
108
|
-
@property
|
|
109
|
-
def digitise_en(self):
|
|
110
|
-
return self._internals["digitise_en"]
|
|
111
|
-
|
|
112
|
-
@property
|
|
113
|
-
def dg_en(self):
|
|
114
|
-
return self._internals["DG_en"]
|
|
115
|
-
|
|
116
|
-
@property
|
|
117
|
-
def int_sync_period(self):
|
|
118
|
-
return self._internals["int_sync_period"]
|
|
119
|
-
|
|
120
|
-
@property
|
|
121
|
-
def sensor_sel(self):
|
|
122
|
-
return self._internals["sensor_sel"]
|
|
123
|
-
|
|
124
|
-
@property
|
|
125
|
-
def ccd_read_en(self):
|
|
126
|
-
return self._internals["ccd_read_en"]
|
|
127
|
-
|
|
128
|
-
def get_value(self, name: str):
|
|
129
|
-
return self._internals[name]
|
|
130
|
-
|
|
131
|
-
def get_parameter_names(self):
|
|
132
|
-
return self._internals.keys()
|
|
133
|
-
|
|
134
|
-
def update_at_400ms(self, reg_map: RegisterMap):
|
|
135
|
-
"""
|
|
136
|
-
Update the state from all the relevant values of the Register Map. In principle, triggered
|
|
137
|
-
by the 400ms pulse, the N-FEE will update it's internal state from all the values in the
|
|
138
|
-
Register Map. For the purpose of the DPU Processor, we only need a sub-set of these values.
|
|
139
|
-
Since the DPU Processor doesn't know about pulses, it decides if a 400ms pulse was received
|
|
140
|
-
from the content of the HK packet header. A 400ms pulse was received when the
|
|
141
|
-
frame number is the housekeeping packet is zero, frame_number==0.
|
|
142
|
-
|
|
143
|
-
Args:
|
|
144
|
-
reg_map (RegisterMap): the DPU Processor register map
|
|
145
|
-
|
|
146
|
-
"""
|
|
147
|
-
|
|
148
|
-
MODULE_LOGGER.debug("Updating N-FEE State at 400ms..")
|
|
149
|
-
|
|
150
|
-
for par_name in self._internals:
|
|
151
|
-
self._internals[par_name] = reg_map[par_name]
|
|
152
|
-
|
|
153
|
-
def update_at_200ms(self, reg_map: RegisterMap):
|
|
154
|
-
"""
|
|
155
|
-
Update the state from selected values of the Register Map. Only the following parameters
|
|
156
|
-
are updated at a 200ms pulse. We only have 200ms pulses when in external sync mode. The
|
|
157
|
-
update shall be done on frame_number == 1, 2, or 3.
|
|
158
|
-
|
|
159
|
-
* sensor_sel: the CCD side 'E=0b10' or 'F=0b01' or BOTH=0b11. This is a 2-bit number.
|
|
160
|
-
* ccd_read_en: flag to enable/disable CCD readout
|
|
161
|
-
|
|
162
|
-
Args:
|
|
163
|
-
reg_map (RegisterMap): the DPU Processor register map
|
|
164
|
-
|
|
165
|
-
"""
|
|
166
|
-
|
|
167
|
-
MODULE_LOGGER.debug("Updating N-FEE State at 200ms..")
|
|
168
|
-
|
|
169
|
-
for par_name in "sensor_sel", "ccd_read_en":
|
|
170
|
-
self._internals[par_name] = reg_map[par_name]
|
|
171
|
-
|
|
172
|
-
def get_state(self):
|
|
173
|
-
return NFEEState.StateTuple(**self._internals)
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
def read_register_from_n_fee(
|
|
177
|
-
transport: SpaceWireInterface, register_map: RegisterMap, reg_name: str
|
|
178
|
-
) -> bytes:
|
|
179
|
-
"""
|
|
180
|
-
Reads the data for the given register from the N-FEE memory map.
|
|
181
|
-
|
|
182
|
-
This function sends an RMAP read request for the register to the N-FEE.
|
|
183
|
-
The returned data is then compared to the data read from the local copy
|
|
184
|
-
of the register map. If the data is different, the local data is replaced
|
|
185
|
-
with the retrieved data and a warning message is issued. The function
|
|
186
|
-
finally returns the retrieved data as a bytes object of length 4.
|
|
187
|
-
|
|
188
|
-
Args:
|
|
189
|
-
transport (SpaceWireInterface): the transport method
|
|
190
|
-
register_map (RegisterMap): a local copy of the register map
|
|
191
|
-
reg_name (str): the name of the register to fetch from the N-FEE
|
|
192
|
-
|
|
193
|
-
Returns:
|
|
194
|
-
data: the 32-bit data that was read from the N-FEE.
|
|
195
|
-
|
|
196
|
-
"""
|
|
197
|
-
|
|
198
|
-
reg: Register = register_map.get_register(reg_name)
|
|
199
|
-
address = reg.address
|
|
200
|
-
|
|
201
|
-
rx_data = transport.read_register(address)
|
|
202
|
-
data = register_map.get_register_data(reg_name)
|
|
203
|
-
|
|
204
|
-
if rx_data != data:
|
|
205
|
-
MODULE_LOGGER.warning(
|
|
206
|
-
f"Data received for {reg.name} is different from local copy: {rx_data} != {data}"
|
|
207
|
-
)
|
|
208
|
-
|
|
209
|
-
# update the local copy of the registry
|
|
210
|
-
register_map.set_register_data(reg_name, rx_data)
|
|
211
|
-
|
|
212
|
-
return rx_data
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
def write_register_on_n_fee(
|
|
216
|
-
transport: SpaceWireInterface, register_map: RegisterMap, reg_name: str
|
|
217
|
-
):
|
|
218
|
-
"""
|
|
219
|
-
Writes the data from the given register to the N-FEE memory map.
|
|
220
|
-
|
|
221
|
-
The function reads the data for the registry from the local register map
|
|
222
|
-
and then sends an RMAP write request for the register to the N-FEE.
|
|
223
|
-
|
|
224
|
-
.. note:: it is assumed that the local register map is up-to-date.
|
|
225
|
-
|
|
226
|
-
Args:
|
|
227
|
-
transport (SpaceWireInterface): the transport method
|
|
228
|
-
register_map (RegisterMap): a local copy of the register map
|
|
229
|
-
reg_name (str): the name of the register to fetch from the N-FEE
|
|
230
|
-
|
|
231
|
-
Raises:
|
|
232
|
-
RMAPError: when data can not be written on the target, i.e. the N-FEE.
|
|
233
|
-
"""
|
|
234
|
-
|
|
235
|
-
reg: Register = register_map.get_register(reg_name)
|
|
236
|
-
address = reg.address
|
|
237
|
-
|
|
238
|
-
data = register_map.get_register_data(reg_name)
|
|
239
|
-
|
|
240
|
-
# Prepare and send the RMAP write request command
|
|
241
|
-
# This function can generate an RMAPError, but we let it pass so that it
|
|
242
|
-
# can be caught at a higher level.
|
|
243
|
-
|
|
244
|
-
_ = transport.write_register(address, data)
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
def command_noop(*args, **kwargs):
|
|
248
|
-
MODULE_LOGGER.debug("No commanding during this sync period.")
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
def command_sync_register_map(transport: SpaceWireInterface, register_map: RegisterMap):
|
|
252
|
-
"""
|
|
253
|
-
Reads the full register from the N-FEE and initializes the local register map with
|
|
254
|
-
the returned data.
|
|
255
|
-
|
|
256
|
-
Args:
|
|
257
|
-
transport (SpaceWireInterface): interface to use for SpaceWire communication
|
|
258
|
-
register_map (RegisterMap): the N-FEE register map
|
|
259
|
-
"""
|
|
260
|
-
|
|
261
|
-
# In principle, we should request each register separately, but the N-FEE allows even in
|
|
262
|
-
# critical memory to read the full register at once. I leave the original code here should
|
|
263
|
-
# the behaviour of the N-FEE become more restrictive again.
|
|
264
|
-
#
|
|
265
|
-
# for reg_name in register_map:
|
|
266
|
-
# read_register_from_n_fee(transport, register_map, reg_name)
|
|
267
|
-
|
|
268
|
-
with Timer("Request full register from N-FEE"):
|
|
269
|
-
data = transport.read_register(0x0000_0000, 0x800, strict=False)
|
|
270
|
-
register_map.set_data(0x0000_0000, data, 0x800)
|
|
271
|
-
|
|
272
|
-
return register_map
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
def command_get_hk_information(transport: SpaceWireInterface, register_map: RegisterMap, address: int, data_length: int) -> bytes:
|
|
276
|
-
"""
|
|
277
|
-
Reads the memory area of the N-FEE where the housekeeping information is saved. This area is located between
|
|
278
|
-
0x0700 – 0x07FC (inclusive) [see PLATO-DLR-PL-ICD-010].
|
|
279
|
-
|
|
280
|
-
Args:
|
|
281
|
-
transport (SpaceWireInterface): interface to use for SpaceWire communication
|
|
282
|
-
register_map (RegisterMap): the N-FEE register map -> not used in this function
|
|
283
|
-
address (int): start address
|
|
284
|
-
data_length (int): number of bytes
|
|
285
|
-
|
|
286
|
-
Returns:
|
|
287
|
-
A bytes object containing the housekeeping information.
|
|
288
|
-
"""
|
|
289
|
-
|
|
290
|
-
return transport.read_memory_map(address, data_length)
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
def command_set_nfee_fpga_defaults(transport: SpaceWireInterface, register_map: RegisterMap, default_values: dict):
|
|
294
|
-
"""
|
|
295
|
-
Set the camera specific default FPGA parameters for the N-FEE.
|
|
296
|
-
|
|
297
|
-
Args:
|
|
298
|
-
default_values (dict): FPGA defaults
|
|
299
|
-
transport (SpaceWireInterface): interface to use for SpaceWire communication
|
|
300
|
-
register_map (RegisterMap): the N-FEE register map
|
|
301
|
-
"""
|
|
302
|
-
|
|
303
|
-
MODULE_LOGGER.info("Set default values for the FPGA")
|
|
304
|
-
|
|
305
|
-
for reg_name in default_values:
|
|
306
|
-
hex_string = str(default_values[reg_name])
|
|
307
|
-
byte_string = int(hex_string, 16).to_bytes(length=4, byteorder='big', signed=False)
|
|
308
|
-
|
|
309
|
-
MODULE_LOGGER.info(f"Set default value for {reg_name} ({default_values[reg_name]})")
|
|
310
|
-
|
|
311
|
-
register_map.set_register_data(reg_name, byte_string)
|
|
312
|
-
write_register_on_n_fee(transport, register_map, reg_name)
|
|
313
|
-
|
|
314
|
-
return True
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
def command_get_mode(transport: SpaceWireInterface, register_map: RegisterMap):
|
|
318
|
-
MODULE_LOGGER.info("Request mode from N-FEE.")
|
|
319
|
-
|
|
320
|
-
reg: Register = register_map.get_register("reg_21_config")
|
|
321
|
-
|
|
322
|
-
read_register_from_n_fee(transport, register_map, reg.name)
|
|
323
|
-
|
|
324
|
-
return register_map.get_value("reg_21_config", "ccd_mode_config")
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
def prio_command_is_dump_mode(n_fee_state: NFEEState.StateTuple,
|
|
328
|
-
dpu_internals: "DPUInternals", register_map: RegisterMap) -> bool:
|
|
329
|
-
MODULE_LOGGER.info("Request N-FEE if in DUMP mode (prio).")
|
|
330
|
-
|
|
331
|
-
# This is a prio command which means it will be executed as soon as possible and return quickly.
|
|
332
|
-
# Mode change in the N-FEE happens only on long (400ms) pulses, therefore prio commands act on
|
|
333
|
-
# the N-FEE State instead of the RegisterMap.
|
|
334
|
-
|
|
335
|
-
return (
|
|
336
|
-
not n_fee_state.digitise_en and n_fee_state.DG_en and
|
|
337
|
-
n_fee_state.ccd_mode_config == n_fee_mode.FULL_IMAGE_MODE
|
|
338
|
-
)
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
def prio_command_get_register_map(n_fee_state: NFEEState.StateTuple,
|
|
342
|
-
dpu_internals: "DPUInternals", register_map: RegisterMap):
|
|
343
|
-
MODULE_LOGGER.info("Request register map from DPU Processor (prio).")
|
|
344
|
-
|
|
345
|
-
# This is a prio command which means it will be executed as soon as possible and return quickly.
|
|
346
|
-
# Mode change in the N-FEE happens only on long (400ms) pulses, therefore prio commands act on
|
|
347
|
-
# the N-FEE State instead of the RegisterMap.
|
|
348
|
-
|
|
349
|
-
return register_map
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
def prio_command_get_mode(n_fee_state: NFEEState.StateTuple,
|
|
353
|
-
dpu_internals: "DPUInternals", register_map: RegisterMap):
|
|
354
|
-
MODULE_LOGGER.info("Request mode from N-FEE (prio).")
|
|
355
|
-
|
|
356
|
-
# This is a prio command which means it will be executed as soon as possible and return quickly.
|
|
357
|
-
# Mode change in the N-FEE happens only on long (400ms) pulses, therefore prio commands act on
|
|
358
|
-
# the N-FEE State instead of the RegisterMap.
|
|
359
|
-
|
|
360
|
-
return n_fee_state.ccd_mode_config
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
def prio_command_get_sync_mode(n_fee_state: NFEEState.StateTuple,
|
|
364
|
-
dpu_internals: "DPUInternals", register_map: RegisterMap):
|
|
365
|
-
MODULE_LOGGER.info("Request sync mode from N-FEE (prio).")
|
|
366
|
-
|
|
367
|
-
# This is a prio command which means it will be executed as soon as possible and return quickly.
|
|
368
|
-
# Mode change in the N-FEE happens only on long (400ms) pulses, therefore prio commands act on
|
|
369
|
-
# the N-FEE State instead of the RegisterMap.
|
|
370
|
-
|
|
371
|
-
return n_fee_state.sync_sel
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
def prio_command_set_slicing(n_fee_state: namedtuple,
|
|
375
|
-
dpu_internals: "DPUInternals", register_map: RegisterMap, num_cycles: int):
|
|
376
|
-
MODULE_LOGGER.info(f"Set slicing parameter: {num_cycles = } (prio)")
|
|
377
|
-
|
|
378
|
-
# This is a prio command which means it will be executed as soon as possible and return quickly.
|
|
379
|
-
# Mode change in the N-FEE happens only on long (400ms) pulses, therefore prio commands act on
|
|
380
|
-
# the N-FEE State instead of the RegisterMap.
|
|
381
|
-
|
|
382
|
-
dpu_internals.slicing_num_cycles = num_cycles
|
|
383
|
-
|
|
384
|
-
return num_cycles
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
def prio_command_get_slicing(n_fee_state: namedtuple,
|
|
388
|
-
dpu_internals: "DPUInternals", register_map: RegisterMap) -> int:
|
|
389
|
-
MODULE_LOGGER.info("Request slicing parameter (prio)")
|
|
390
|
-
|
|
391
|
-
# This is a prio command which means it will be executed as soon as possible and return quickly.
|
|
392
|
-
# Mode change in the N-FEE happens only on long (400ms) pulses, therefore prio commands act on
|
|
393
|
-
# the N-FEE State instead of the RegisterMap.
|
|
394
|
-
|
|
395
|
-
return dpu_internals.slicing_num_cycles
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
def command_set_immediate_on_mode(transport: SpaceWireInterface, register_map: RegisterMap):
|
|
399
|
-
# TODO (Rik): this command shall become a prio_command
|
|
400
|
-
# Check what the N-FEE does and what is returned as a response, especially since in the
|
|
401
|
-
# mean time other packets can be returned. This method I think will return a
|
|
402
|
-
# WriteRequestReply, but it is probably asynchronously!
|
|
403
|
-
MODULE_LOGGER.info("Commanding N-FEE into IMMEDIATE ON mode.")
|
|
404
|
-
|
|
405
|
-
reg: Register = register_map.get_register("reg_21_config")
|
|
406
|
-
|
|
407
|
-
read_register_from_n_fee(transport, register_map, reg.name)
|
|
408
|
-
|
|
409
|
-
register_map.set_value(reg.name, "ccd_mode_config", n_fee_mode.IMMEDIATE_ON_MODE)
|
|
410
|
-
|
|
411
|
-
MODULE_LOGGER.debug("Sending write request to N-FEE for IMMEDIATE ON mode.")
|
|
412
|
-
|
|
413
|
-
write_register_on_n_fee(transport, register_map, reg.name)
|
|
414
|
-
|
|
415
|
-
return n_fee_mode.IMMEDIATE_ON_MODE.value
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
def command_set_high_precision_hk_mode(transport: SpaceWireInterface, register_map: RegisterMap,
|
|
419
|
-
flag: bool):
|
|
420
|
-
MODULE_LOGGER.info("Commanding N-FEE into HIGH PRECISION HK mode.")
|
|
421
|
-
|
|
422
|
-
reg: Register = register_map.get_register("reg_5_config")
|
|
423
|
-
|
|
424
|
-
read_register_from_n_fee(transport, register_map, reg.name)
|
|
425
|
-
|
|
426
|
-
register_map.set_value(reg.name, "High_precision_HK_en", flag)
|
|
427
|
-
|
|
428
|
-
MODULE_LOGGER.debug("Sending write request to N-FEE for High Precision HK mode.")
|
|
429
|
-
|
|
430
|
-
write_register_on_n_fee(transport, register_map, reg.name)
|
|
431
|
-
|
|
432
|
-
return flag
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
def command_set_on_mode(transport: SpaceWireInterface, register_map: RegisterMap):
|
|
436
|
-
MODULE_LOGGER.info("Commanding N-FEE into ON mode.")
|
|
437
|
-
|
|
438
|
-
_set_register(transport, register_map, "reg_21_config", ccd_mode_config=n_fee_mode.ON_MODE)
|
|
439
|
-
|
|
440
|
-
return register_map["ccd_mode_config"]
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
def command_set_standby_mode(transport: SpaceWireInterface, register_map: RegisterMap):
|
|
444
|
-
MODULE_LOGGER.info("Commanding N-FEE into StandBy mode.")
|
|
445
|
-
|
|
446
|
-
_set_register(transport, register_map, "reg_21_config", ccd_mode_config=n_fee_mode.STAND_BY_MODE)
|
|
447
|
-
|
|
448
|
-
return register_map["ccd_mode_config"]
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
def command_set_dump_mode(
|
|
452
|
-
transport: SpaceWireInterface,
|
|
453
|
-
register_map: RegisterMap,
|
|
454
|
-
v_start: int = 0, v_end: int = 0, sensor_sel_=SENSOR_SEL_BOTH_SIDES,
|
|
455
|
-
ccd_readout_order: int = DEFAULT_CCD_READOUT_ORDER,
|
|
456
|
-
n_final_dump: int = 4510, sync_sel: int = 0
|
|
457
|
-
):
|
|
458
|
-
MODULE_LOGGER.info("Commanding N-FEE into dump mode.")
|
|
459
|
-
|
|
460
|
-
MODULE_LOGGER.info(
|
|
461
|
-
f"Setting {v_start=} and {v_end=}, {v_end - v_start + 1} lines, {sensor_sel_=}")
|
|
462
|
-
|
|
463
|
-
_set_register(transport, register_map, "reg_0_config", v_start=v_start, v_end=v_end)
|
|
464
|
-
_set_register(transport, register_map, "reg_2_config", ccd_readout_order=ccd_readout_order)
|
|
465
|
-
_set_register(transport, register_map, "reg_3_config",
|
|
466
|
-
n_final_dump=n_final_dump, charge_injection_en=0, img_clk_dir=0, reg_clk_dir=0)
|
|
467
|
-
_set_register(transport, register_map, "reg_5_config",
|
|
468
|
-
sensor_sel=sensor_sel_, digitise_en=0b00, DG_en=0b01, sync_sel=sync_sel)
|
|
469
|
-
_set_register(transport, register_map, "reg_21_config",
|
|
470
|
-
ccd_mode_config=n_fee_mode.FULL_IMAGE_MODE)
|
|
471
|
-
|
|
472
|
-
# Set (back) the default values for VGD as they might have been changed by charge injection
|
|
473
|
-
|
|
474
|
-
# _set_register(transport, register_map, "reg_19_config", ccd_vgd_config=0xE)
|
|
475
|
-
# _set_register(transport, register_map, "reg_20_config", ccd_vgd_config=0xCF)
|
|
476
|
-
|
|
477
|
-
return register_map["ccd_mode_config"]
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
def command_set_dump_mode_int_sync(
|
|
481
|
-
transport: SpaceWireInterface,
|
|
482
|
-
register_map: RegisterMap,
|
|
483
|
-
v_start: int = 0, v_end: int = 0, sensor_sel_=SENSOR_SEL_BOTH_SIDES,
|
|
484
|
-
ccd_readout_order: int = DEFAULT_CCD_READOUT_ORDER,
|
|
485
|
-
n_final_dump: int = 4510, int_sync_period: int = 600, sync_sel: int = 1
|
|
486
|
-
):
|
|
487
|
-
MODULE_LOGGER.info("Commanding N-FEE into internal sync dump mode.")
|
|
488
|
-
|
|
489
|
-
MODULE_LOGGER.info(
|
|
490
|
-
f"Setting {v_start=} and {v_end=}, {v_end - v_start + 1} lines, {sensor_sel_=}, {n_final_dump=}")
|
|
491
|
-
|
|
492
|
-
_set_register(transport, register_map, "reg_0_config", v_start=v_start, v_end=v_end)
|
|
493
|
-
_set_register(transport, register_map, "reg_2_config", ccd_readout_order=ccd_readout_order)
|
|
494
|
-
_set_register(transport, register_map, "reg_3_config",
|
|
495
|
-
n_final_dump=n_final_dump, charge_injection_en=0, img_clk_dir=0, reg_clk_dir=0)
|
|
496
|
-
_set_register(transport, register_map, "reg_4_config", int_sync_period=int_sync_period)
|
|
497
|
-
_set_register(transport, register_map, "reg_5_config",
|
|
498
|
-
sensor_sel=sensor_sel_, digitise_en=0b00, DG_en=0b01, sync_sel=sync_sel)
|
|
499
|
-
_set_register(transport, register_map, "reg_21_config",
|
|
500
|
-
ccd_mode_config=n_fee_mode.FULL_IMAGE_MODE)
|
|
501
|
-
|
|
502
|
-
return register_map["ccd_mode_config"]
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
def _set_register(transport: SpaceWireInterface, register_map: RegisterMap, reg_name: str, **kwarg: int):
|
|
506
|
-
"""
|
|
507
|
-
Set a register from its individual parameters and sends the register to the N-FEE. This
|
|
508
|
-
function first reads the register from the N-FEE and updates the local register if there is a
|
|
509
|
-
mismatch.
|
|
510
|
-
|
|
511
|
-
Args:
|
|
512
|
-
transport: the transport layer for SpaceWire communication
|
|
513
|
-
register_map (RegisterMap): a local copy of the register map (maintained by the DPU
|
|
514
|
-
Processor)
|
|
515
|
-
reg_name (str): the name of the register
|
|
516
|
-
kwarg (dict): a dictionary with the parameter names and their values
|
|
517
|
-
|
|
518
|
-
Returns:
|
|
519
|
-
None.
|
|
520
|
-
|
|
521
|
-
"""
|
|
522
|
-
reg: Register = register_map.get_register(reg_name)
|
|
523
|
-
|
|
524
|
-
read_register_from_n_fee(transport, register_map, reg.name)
|
|
525
|
-
|
|
526
|
-
for k, v in kwarg.items():
|
|
527
|
-
register_map.set_value(reg.name, k, v)
|
|
528
|
-
|
|
529
|
-
write_register_on_n_fee(transport, register_map, reg.name)
|
|
530
|
-
read_register_from_n_fee(transport, register_map, reg.name)
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
def command_set_full_image_mode(
|
|
534
|
-
transport: SpaceWireInterface,
|
|
535
|
-
register_map: RegisterMap,
|
|
536
|
-
v_start: int = 0, v_end: int = 4509, sensor_sel_=SENSOR_SEL_BOTH_SIDES,
|
|
537
|
-
ccd_readout_order=None, n_final_dump=0
|
|
538
|
-
):
|
|
539
|
-
MODULE_LOGGER.info("Commanding N-FEE into Full Image mode.")
|
|
540
|
-
|
|
541
|
-
MODULE_LOGGER.debug(
|
|
542
|
-
f"Setting {v_start=} and {v_end=}, {v_end - v_start + 1} lines, {sensor_sel_=}")
|
|
543
|
-
|
|
544
|
-
_set_register(transport, register_map, "reg_0_config", v_start=v_start, v_end=v_end)
|
|
545
|
-
_set_register(transport, register_map, "reg_2_config", ccd_readout_order=ccd_readout_order)
|
|
546
|
-
_set_register(transport, register_map, "reg_3_config", n_final_dump=n_final_dump)
|
|
547
|
-
_set_register(transport, register_map, "reg_5_config",
|
|
548
|
-
sensor_sel=sensor_sel_, digitise_en=0b01, DG_en=0b00, sync_sel=0)
|
|
549
|
-
_set_register(transport, register_map, "reg_21_config", ccd_mode_config=n_fee_mode.FULL_IMAGE_MODE)
|
|
550
|
-
|
|
551
|
-
return n_fee_mode.FULL_IMAGE_MODE.value
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
def command_set_full_image_mode_int_sync(
|
|
555
|
-
transport: SpaceWireInterface,
|
|
556
|
-
register_map: RegisterMap,
|
|
557
|
-
v_start: int = 0, v_end: int = 4509, sensor_sel_=SENSOR_SEL_BOTH_SIDES,
|
|
558
|
-
ccd_readout_order=None, n_final_dump=0,
|
|
559
|
-
int_sync_period=6250
|
|
560
|
-
):
|
|
561
|
-
MODULE_LOGGER.info("Commanding N-FEE into Full Image mode and internal sync.")
|
|
562
|
-
|
|
563
|
-
MODULE_LOGGER.debug(
|
|
564
|
-
f"Setting {v_start=} and {v_end=}, {v_end - v_start + 1} lines, {sensor_sel_=}, "
|
|
565
|
-
f"{ccd_readout_order=}, {int_sync_period=}")
|
|
566
|
-
|
|
567
|
-
_set_register(transport, register_map, "reg_0_config", v_start=v_start, v_end=v_end)
|
|
568
|
-
_set_register(transport, register_map, "reg_2_config", ccd_readout_order=ccd_readout_order)
|
|
569
|
-
_set_register(transport, register_map, "reg_3_config", n_final_dump=n_final_dump)
|
|
570
|
-
_set_register(transport, register_map, "reg_4_config", int_sync_period=int_sync_period)
|
|
571
|
-
_set_register(transport, register_map, "reg_5_config",
|
|
572
|
-
sensor_sel=sensor_sel_, digitise_en=0b01, DG_en=0b00, sync_sel=1)
|
|
573
|
-
_set_register(transport, register_map, "reg_21_config", ccd_mode_config=n_fee_mode.FULL_IMAGE_MODE)
|
|
574
|
-
|
|
575
|
-
return n_fee_mode.FULL_IMAGE_MODE.value
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
def command_set_register_value(
|
|
579
|
-
transport: SpaceWireInterface,
|
|
580
|
-
register_map: RegisterMap,
|
|
581
|
-
reg_name: str, field_name: str, field_value: int
|
|
582
|
-
):
|
|
583
|
-
MODULE_LOGGER.info(f"Commanding N-FEE to set register value {field_name=} to {field_value=}.")
|
|
584
|
-
|
|
585
|
-
_set_register(transport, register_map, reg_name, **{field_name: field_value})
|
|
586
|
-
|
|
587
|
-
return True
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
def command_reset(transport: SpaceWireInterface, register_map: RegisterMap):
|
|
591
|
-
|
|
592
|
-
MODULE_LOGGER.info("Commanding N-FEE to reset to default settings.")
|
|
593
|
-
|
|
594
|
-
_set_register(transport, register_map, "reg_21_config", ccd_mode_config=0x07)
|
|
595
|
-
|
|
596
|
-
return True
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
def command_internal_clock(
|
|
600
|
-
transport: SpaceWireInterface,
|
|
601
|
-
register_map: RegisterMap,
|
|
602
|
-
int_sync_period: int
|
|
603
|
-
):
|
|
604
|
-
MODULE_LOGGER.info(f"Commanding N-FEE the internal clock to {int_sync_period=}ms and select it.")
|
|
605
|
-
|
|
606
|
-
_set_register(transport, register_map, "reg_4_config", int_sync_period=int_sync_period)
|
|
607
|
-
_set_register(transport, register_map, "reg_5_config", sync_sel=1)
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
def command_external_clock(
|
|
611
|
-
transport: SpaceWireInterface,
|
|
612
|
-
register_map: RegisterMap,
|
|
613
|
-
):
|
|
614
|
-
MODULE_LOGGER.info("Commanding N-FEE to use the external clock.")
|
|
615
|
-
|
|
616
|
-
_set_register(transport, register_map, "reg_5_config", sync_sel=0)
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
def command_set_full_image_pattern_mode(
|
|
620
|
-
transport: SpaceWireInterface,
|
|
621
|
-
register_map: RegisterMap,
|
|
622
|
-
v_start: int = 0,
|
|
623
|
-
v_end: int = 4509,
|
|
624
|
-
sensor_sel_=SENSOR_SEL_BOTH_SIDES,
|
|
625
|
-
):
|
|
626
|
-
"""
|
|
627
|
-
Command the N-FEE into Full Image Pattern mode. This mode can only be reached from the ON_MODE,
|
|
628
|
-
but this is not checked by this function (it is an assumption that the caller has checked this).
|
|
629
|
-
|
|
630
|
-
.. note:: this function is currently N-FEE specific.
|
|
631
|
-
|
|
632
|
-
Args:
|
|
633
|
-
transport: the transport layer for SpaceWire communication
|
|
634
|
-
register_map (RegisterMap): a local copy of the register map
|
|
635
|
-
v_start (int): the start line for the readout
|
|
636
|
-
v_end (int): the last line for the readout
|
|
637
|
-
sensor_sel_ (int): the side of the CCD that needs to be transferred
|
|
638
|
-
|
|
639
|
-
Returns:
|
|
640
|
-
None.
|
|
641
|
-
"""
|
|
642
|
-
MODULE_LOGGER.info("Commanding N-FEE into Full Image Pattern mode.")
|
|
643
|
-
|
|
644
|
-
MODULE_LOGGER.debug(
|
|
645
|
-
f"Setting {v_start=} and {v_end=}, {v_end - v_start + 1} lines, {sensor_sel_=}")
|
|
646
|
-
|
|
647
|
-
_set_register(transport, register_map, "reg_0_config", v_start=v_start, v_end=v_end)
|
|
648
|
-
# _set_register(transport, register_map, "reg_2_config", ccd_readout_order=ccd_readout_order)
|
|
649
|
-
_set_register(transport, register_map, "reg_5_config", sensor_sel=sensor_sel_)
|
|
650
|
-
_set_register(transport, register_map, "reg_5_config", digitise_en=0b01) # send data to DPU
|
|
651
|
-
_set_register(transport, register_map, "reg_5_config", DG_en=0b00) # dump gate low
|
|
652
|
-
_set_register(transport, register_map, "reg_21_config", ccd_mode_config=n_fee_mode.FULL_IMAGE_PATTERN_MODE)
|
|
653
|
-
|
|
654
|
-
return n_fee_mode.FULL_IMAGE_PATTERN_MODE.value
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
def command_set_clear_error_flags(transport: SpaceWireInterface, register_map: RegisterMap):
|
|
658
|
-
"""
|
|
659
|
-
Clear all error flags generated by the N-FEE FPGA for non RMAP/SpW related functions immediately.
|
|
660
|
-
|
|
661
|
-
The `clear_error_flag` bit in the register map is set to 1, meaning that all error flags that
|
|
662
|
-
are generated by the N-FEE FPGA for non RMAP-SpW related functions are cleared immediately.
|
|
663
|
-
This bit is cleared automatically, so that any future error flags can be latched again. If
|
|
664
|
-
the error conditions persist and no corrective measures are taken, then error flags would be
|
|
665
|
-
set again.
|
|
666
|
-
"""
|
|
667
|
-
# keep debug level because this command is sent on each readout
|
|
668
|
-
MODULE_LOGGER.debug("Commanding N-FEE to clear error flag.")
|
|
669
|
-
|
|
670
|
-
_set_register(transport, register_map, "reg_21_config", clear_error_flag=1)
|
|
671
|
-
|
|
672
|
-
return register_map["clear_error_flag"]
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
def command_set_readout_order(transport: SpaceWireInterface, register_map: RegisterMap, ccd_readout_order: int):
|
|
676
|
-
"""
|
|
677
|
-
Sets the given ccd_readout_order in the register map, then sends this change to the N-FEE.
|
|
678
|
-
"""
|
|
679
|
-
MODULE_LOGGER.info(f"Commanding N-FEE – set readout order to 0x{ccd_readout_order:02x}.")
|
|
680
|
-
|
|
681
|
-
_set_register(transport, register_map, "reg_2_config", ccd_readout_order=ccd_readout_order)
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
def command_set_reverse_clocking(
|
|
685
|
-
transport: SpaceWireInterface,
|
|
686
|
-
register_map: RegisterMap,
|
|
687
|
-
v_start: int = 0,
|
|
688
|
-
v_end: int = 4509,
|
|
689
|
-
sensor_sel_=SENSOR_SEL_BOTH_SIDES,
|
|
690
|
-
ccd_readout_order=None,
|
|
691
|
-
n_final_dump=0,
|
|
692
|
-
img_clk_dir=0,
|
|
693
|
-
reg_clk_dir=0,
|
|
694
|
-
):
|
|
695
|
-
"""
|
|
696
|
-
Command the N-FEE into full image reverse clocking mode.
|
|
697
|
-
"""
|
|
698
|
-
MODULE_LOGGER.info("Commanding N-FEE to reverse clocking.")
|
|
699
|
-
|
|
700
|
-
_set_register(transport, register_map, "reg_0_config", v_start=v_start, v_end=v_end)
|
|
701
|
-
_set_register(transport, register_map, "reg_2_config", ccd_readout_order=ccd_readout_order)
|
|
702
|
-
_set_register(transport, register_map, "reg_3_config",
|
|
703
|
-
n_final_dump=n_final_dump, img_clk_dir=img_clk_dir, reg_clk_dir=reg_clk_dir)
|
|
704
|
-
_set_register(transport, register_map, "reg_5_config",
|
|
705
|
-
sensor_sel=sensor_sel_, digitise_en=0b01, DG_en=0b00, sync_sel=0)
|
|
706
|
-
_set_register(transport, register_map, "reg_21_config", ccd_mode_config=n_fee_mode.FULL_IMAGE_MODE)
|
|
707
|
-
|
|
708
|
-
return True
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
def command_set_charge_injection(
|
|
712
|
-
transport: SpaceWireInterface,
|
|
713
|
-
register_map: RegisterMap,
|
|
714
|
-
v_start: int = 0,
|
|
715
|
-
v_end: int = 4509,
|
|
716
|
-
n_final_dump=0,
|
|
717
|
-
sensor_sel_=SENSOR_SEL_BOTH_SIDES,
|
|
718
|
-
ccd_readout_order=None,
|
|
719
|
-
charge_injection_width=0,
|
|
720
|
-
charge_injection_gap=0,
|
|
721
|
-
):
|
|
722
|
-
"""
|
|
723
|
-
TBW
|
|
724
|
-
"""
|
|
725
|
-
MODULE_LOGGER.info("Commanding N-FEE to configure charge injection.")
|
|
726
|
-
|
|
727
|
-
_set_register(
|
|
728
|
-
transport, register_map, "reg_0_config",
|
|
729
|
-
v_start=v_start, v_end=v_end)
|
|
730
|
-
_set_register(
|
|
731
|
-
transport, register_map, "reg_1_config",
|
|
732
|
-
charge_injection_width=charge_injection_width,
|
|
733
|
-
charge_injection_gap=charge_injection_gap)
|
|
734
|
-
_set_register(
|
|
735
|
-
transport, register_map, "reg_2_config",
|
|
736
|
-
ccd_readout_order=ccd_readout_order)
|
|
737
|
-
_set_register(
|
|
738
|
-
transport, register_map, "reg_3_config",
|
|
739
|
-
n_final_dump=n_final_dump, charge_injection_en=1)
|
|
740
|
-
_set_register(
|
|
741
|
-
transport, register_map, "reg_5_config",
|
|
742
|
-
sensor_sel=sensor_sel_, digitise_en=0b01, DG_en=0b00)
|
|
743
|
-
_set_register(
|
|
744
|
-
transport, register_map, "reg_21_config",
|
|
745
|
-
ccd_mode_config=n_fee_mode.FULL_IMAGE_MODE)
|
|
746
|
-
|
|
747
|
-
return True
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
def command_set_vgd(
|
|
751
|
-
transport: SpaceWireInterface,
|
|
752
|
-
register_map: RegisterMap,
|
|
753
|
-
ccd_vgd_config: Optional[float] = None,
|
|
754
|
-
):
|
|
755
|
-
"""
|
|
756
|
-
Set the ccd_vgd_config register value.
|
|
757
|
-
|
|
758
|
-
Note that the N-FEE shall be in ON mode for this to take effect!
|
|
759
|
-
"""
|
|
760
|
-
|
|
761
|
-
MODULE_LOGGER.info(f"{ccd_vgd_config=}")
|
|
762
|
-
|
|
763
|
-
if ccd_vgd_config is not None:
|
|
764
|
-
|
|
765
|
-
# HARDCODED STUFF HERE
|
|
766
|
-
# FIXME: these numbers should go into the Setup camera.fee section
|
|
767
|
-
# 5.983 -> what is that value? where does it come from? see email Dave Walton
|
|
768
|
-
# Explanation by Dave Walton in MSSL provided test script:
|
|
769
|
-
# V_GD control is 5.983V per bit (12bit DAC). So 17V=2842d, =0xB1A.
|
|
770
|
-
# DAC LS Nibble (0xA in this case) is programmed into MSNibble of reg_4C.
|
|
771
|
-
# DAC MSByte (0xB1 in this case) is programmed into LSByte of reg_50.
|
|
772
|
-
|
|
773
|
-
converted_vgd = int(ccd_vgd_config/5.983*1000)
|
|
774
|
-
|
|
775
|
-
value_reg_19 = converted_vgd & 0b1111
|
|
776
|
-
value_reg_20 = (converted_vgd >> 4) & 0b11111111
|
|
777
|
-
|
|
778
|
-
_set_register(transport, register_map, "reg_19_config", ccd_vgd_config=value_reg_19)
|
|
779
|
-
_set_register(transport, register_map, "reg_20_config", ccd_vgd_config=value_reg_20)
|
|
780
|
-
|
|
781
|
-
return True
|
|
782
|
-
|
|
783
|
-
return False
|