cgse 0.12.1__tar.gz → 0.13.1__tar.gz
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.
- {cgse-0.12.1 → cgse-0.13.1}/.gitignore +1 -0
- {cgse-0.12.1 → cgse-0.13.1}/PKG-INFO +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/docs/libs/cgse-core/registry.md +3 -2
- {cgse-0.12.1 → cgse-0.13.1}/docs/roadmap.md +10 -6
- cgse-0.13.1/duckdb_metrics.db +0 -0
- cgse-0.13.1/duckdb_metrics.db.wal +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/justfile +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/pyproject.toml +8 -7
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/service_registry.db +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/cgse_common/cgse.py +22 -6
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/command.py +0 -41
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/control.py +21 -17
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/dummy.py +16 -1
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/metrics.py +122 -4
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/plugin.py +93 -6
- cgse-0.13.1/libs/cgse-common/src/egse/plugins/metrics/duckdb.py +442 -0
- cgse-0.13.1/libs/cgse-common/src/egse/plugins/metrics/influxdb.py +189 -0
- cgse-0.13.1/libs/cgse-common/src/egse/plugins/metrics/timescaledb.py +596 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/setup.py +69 -434
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/signal.py +5 -1
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/state.py +24 -66
- cgse-0.13.1/libs/cgse-common/tests/test_client_server_interaction.py +107 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_command.py +0 -27
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_hk.py +18 -20
- cgse-0.13.1/libs/cgse-common/tests/test_influxdb_plugin.py +142 -0
- cgse-0.13.1/libs/cgse-common/tests/test_metrics.py +25 -0
- cgse-0.13.1/libs/cgse-common/tests/test_plugin.py +29 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_process.py +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_setup.py +31 -26
- cgse-0.13.1/libs/cgse-common/tests/test_state.py +9 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/pyproject.toml +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +27 -26
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +1 -2
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/pyproject.toml +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/cgse_core/services.py +0 -6
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/cgse_core/settings.yaml +12 -4
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/confman/__init__.py +4 -2
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/confman/confman_cs.py +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/logger/log_cs.py +1 -1
- cgse-0.13.1/libs/cgse-core/src/egse/metricshub/server.py +271 -0
- cgse-0.13.1/libs/cgse-core/src/egse/notifyhub/__init__.py +8 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/notifyhub/server.py +38 -18
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/notifyhub/services.py +7 -4
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/notifyhub/test.py +2 -2
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/procman/procman_cs.py +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/procman/procman_protocol.py +5 -1
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/registry/server.py +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/storage/__init__.py +2 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/storage/persistence.py +2 -2
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/storage/storage_cs.py +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/pyproject.toml +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/noxfile.py +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/cgse-tools/pyproject.toml +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +2 -2
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/pyproject.toml +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +40 -12
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_mon.py +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +18 -35
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_services.py +22 -4
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/pyproject.toml +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_services.py +0 -1
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_services.py +3 -3
- {cgse-0.12.1 → cgse-0.13.1}/projects/plato/plato-fits/pyproject.toml +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/projects/plato/plato-hdf5/pyproject.toml +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/projects/plato/plato-spw/pyproject.toml +1 -1
- {cgse-0.12.1 → cgse-0.13.1}/projects/plato/plato-spw/src/egse/spw.py +22 -7
- {cgse-0.12.1 → cgse-0.13.1}/pyproject.toml +4 -4
- {cgse-0.12.1 → cgse-0.13.1}/ruff.toml +2 -2
- cgse-0.13.1/scratch/match-case.py +41 -0
- {cgse-0.12.1 → cgse-0.13.1}/service_registry.db +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/service_registry.db-shm +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/service_registry.db-wal +0 -0
- cgse-0.13.1/temperature_readings.log +43 -0
- cgse-0.12.1/TODO.md +0 -3
- cgse-0.12.1/check_import.py +0 -5
- cgse-0.12.1/libs/cgse-common/tests/test_client_server_interaction.py +0 -90
- cgse-0.12.1/requirements.txt +0 -1728
- cgse-0.12.1/scratch.py +0 -27
- {cgse-0.12.1 → cgse-0.13.1}/.github/workflows/ruff-format-check.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/bump.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/conftest.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/bits.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/calibration.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/command.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/config.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/control.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/counter.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/decorators.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/device.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/dicts.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/dummy.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/env.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/exceptions.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/heartbeat.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/hk.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/index.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/listener.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/metrics.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/mixin.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/monitoring.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/observer.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/obsid.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/persistence.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/plugin.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/process.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/reload.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/settings.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/setup.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/api/system.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/custom_theme/main.html +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/coding_style.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/docs.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/index.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/installation.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/monitoring.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/monorepo.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/nox.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/plugins.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/project-configuration.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/unit_testing.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/uv.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/dev_guide/versioning.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/getting_started.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/help.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/images/github-fork-clone-dark.png +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/images/github-fork-clone.png +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/images/grafana-queries.png +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/images/icons/cgse-logo-blue.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/images/icons/cgse-logo.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/index.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/initialize.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/libs/cgse-common/images/load_methods.png +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/libs/cgse-common/index.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/libs/cgse-common/settings.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/libs/cgse-common/setup.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/libs/cgse-coordinates/index.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/libs/cgse-core/index.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/libs/cgse-gui/index.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/libs/index.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/package_list.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/projects/cgse-tools.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/projects/index.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/projects/symetrie-hexapod.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/stylesheets/custom.css +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/stylesheets/extra.css +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/tutorial.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/docs/user_guide/index.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/identifier.sqlite +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/justfile +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/noxfile.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/cgse_common/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/async_control_claude.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/bits.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/calibration.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/config.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/counter.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/decorators.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/device.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/dicts.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/env.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/exceptions.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/heartbeat.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/hk.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/listener.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/mixin.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/monitoring.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/observer.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/obsid.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/persistence.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/process.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/protocol.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/proxy.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/py.typed +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/randomwalk.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/ratelimit.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/reload.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/resource.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/response.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/scpi.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/services.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/services.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/settings.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/settings.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/socketdevice.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/system.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/task.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/version.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/src/egse/zmq_ser.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/conftest.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/COPYING +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/IAS/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/INTA/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/data/command.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/data/new_local_settings.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/icons/hourglass.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/icons/soap_sponge.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/scripts/empty_process.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/scripts/handle_sigterm.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/scripts/process_with_children.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/scripts/raise_value_error.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/scripts/void-0.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/scripts/void-1.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_bits.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_config.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_control.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_decorators.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_device.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_env.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_fixtures.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_listener.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_mixin.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_protocol.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_ratelimit.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_resource.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_response.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_settings.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_signal.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_system.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_task.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-common/tests/test_zmq_ser.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/cgse_coordinates/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/cgse_coordinates/settings.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/tests/test_avoidance.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/tests/test_coordinates_plot.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/tests/test_coordinates_serialize.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/tests/test_point.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/tests/test_ref_model.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/tests/test_reference_frames.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-coordinates/tests/test_refmodel.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/.envrc.disabled +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/service_registry.db +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/cgse_core/_start.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/cgse_core/_status.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/cgse_core/_stop.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/cgse_core/cgse_explore.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/async_control.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/icons/busy.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/icons/operational-mode.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/icons/pm_ui.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/icons/simulator-mode.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/icons/start-process-button.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/icons/stop-process-button.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/icons/user-interface.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/logger/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
- {cgse-0.12.1/libs/cgse-core/src/egse/notifyhub → cgse-0.13.1/libs/cgse-core/src/egse/metricshub}/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/notifyhub/event.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/procman/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/procman/procman_ui.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/registry/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/registry/backend.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/registry/client.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/registry/service.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/conftest.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/fixtures/default_env.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/fixtures/helpers.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/fixtures/services.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/script_test_async_registry_client.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/script_test_registry_client_server.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/script_test_service_registry_server.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/script_test_sync_registry_client.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/services.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/stress_test_registry_server.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/test_async_control.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/test_cm_cs.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/test_confman_setups.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/test_logger.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/test_registry_backend.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/test_registry_service.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/test_server_running.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/test_server_running_with_fixture.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/test_settings_core.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-core/tests/test_zmq_microservice.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/led.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/states.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/mkdocs.yml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/overrides/.icons/custom/dbend-dark.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/overrides/.icons/custom/dbend-light.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/overrides/.icons/custom/gear.svg +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/cgse-tools/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/cgse-tools/src/cgse_tools/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/justfile +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/noxfile.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/service_registry.db +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_adev.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_dev.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_sim.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/temperature_readings.log +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/tests/script_daq6510_mon.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/tests/test_adev.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/keithley-tempcontrol/tests/test_dev.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_cs.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_devif.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_protocol.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/settings.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/lakeshore-tempcontrol/tests/test_lakeshore336_simulator.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_sim.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/__init__.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/settings.yaml +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/tests/test_puna.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/tests/test_puna_cs.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/generic/symetrie-hexapod/tests/test_puna_simulator.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/plato/plato-fits/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/plato/plato-hdf5/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/projects/plato/plato-spw/README.md +0 -0
- {cgse-0.12.1 → cgse-0.13.1/scratch}/advanced-process-monitoring.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1/scratch}/live-process-monitoring.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1/scratch}/processes.json +0 -0
- {cgse-0.12.1 → cgse-0.13.1/scratch}/simple-process-monitoring.py +0 -0
- {cgse-0.12.1 → cgse-0.13.1}/test_service_registry.db +0 -0
|
@@ -44,11 +44,12 @@ A microservice can register as follows:
|
|
|
44
44
|
from egse.registry.client import AsyncRegistryClient
|
|
45
45
|
|
|
46
46
|
registry_client = AsyncRegistryClient()
|
|
47
|
+
registry_client.connect()
|
|
47
48
|
|
|
48
49
|
service_id = await registry_client.register(
|
|
49
50
|
name=service_name,
|
|
50
|
-
host=
|
|
51
|
-
port=
|
|
51
|
+
host=hostname,
|
|
52
|
+
port=port_number,
|
|
52
53
|
service_type=service_type,
|
|
53
54
|
metadata={},
|
|
54
55
|
ttl=30,
|
|
@@ -31,20 +31,20 @@ Provide a `cgse` command that is extensible with new commands and command groups
|
|
|
31
31
|
|
|
32
32
|
- [ ] Reference Frames and coordinate transformations -> Graphs
|
|
33
33
|
- [ ] Metrics for all devices will be handled using InfluxDB
|
|
34
|
-
- [
|
|
34
|
+
- [x] Use of Grafana to visualize the metrics
|
|
35
35
|
|
|
36
36
|
## Core Services
|
|
37
37
|
|
|
38
38
|
- [ ] Process Manager needs to be added with optimised design and performance
|
|
39
39
|
- [ ] Synoptic Manager
|
|
40
40
|
- [x] Distributed Service Registry
|
|
41
|
-
- [
|
|
41
|
+
- [x] dynamic port assignment for all services -> service registry
|
|
42
42
|
|
|
43
43
|
## Devices
|
|
44
44
|
|
|
45
45
|
- [x] The Symétrie Hexapods: PUNA, ZONDA, JORAN
|
|
46
46
|
- [x] The Keithley Data Acquisition Multimeter
|
|
47
|
-
- [
|
|
47
|
+
- [x] The Lakeshore temperature controller
|
|
48
48
|
|
|
49
49
|
## Projects
|
|
50
50
|
|
|
@@ -67,12 +67,14 @@ Provide a `cgse` command that is extensible with new commands and command groups
|
|
|
67
67
|
use of command YAML files, replace `dynamic_interface` with `dynamic_command`.
|
|
68
68
|
- [ ] Introduce asyncio into the commanding protocol, e.g. `get_status()`
|
|
69
69
|
and `get_housekeeping()` shall be handled asynchronously.
|
|
70
|
-
- [
|
|
70
|
+
- [x] GlobalState Setup needs some redesign, especially `GlobalState.setup`
|
|
71
|
+
which should not consult
|
|
71
72
|
the configuration manager by default.
|
|
72
73
|
|
|
73
74
|
## Removals
|
|
74
75
|
|
|
75
|
-
- [
|
|
76
|
+
- [x] The `get_common_egse_root()` is of no use anymore and needs to be
|
|
77
|
+
removed or replaced in some
|
|
76
78
|
cases.
|
|
77
79
|
|
|
78
80
|
## Testing
|
|
@@ -80,4 +82,6 @@ Provide a `cgse` command that is extensible with new commands and command groups
|
|
|
80
82
|
- [x] Add unit testing with `nox` running tests for Python 3.9, 3.10, 3.11, and 3.12
|
|
81
83
|
- [ ] Add proper unit tests for all packages – using `pytest`
|
|
82
84
|
- [ ] Add a CI test suite
|
|
83
|
-
- [ ]
|
|
85
|
+
- [ ] Add GitHub Action to check proper formatting of all the code in a pull
|
|
86
|
+
request
|
|
87
|
+
- [ ] Add GitHub Actions for running tests before merging
|
|
Binary file
|
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "cgse-common"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.13.1"
|
|
4
4
|
description = "Software framework to support hardware testing"
|
|
5
5
|
authors = [
|
|
6
6
|
{name = "IvS KU Leuven"}
|
|
@@ -19,7 +19,7 @@ keywords = [
|
|
|
19
19
|
"software framework"
|
|
20
20
|
]
|
|
21
21
|
dependencies = [
|
|
22
|
-
"click>=8.1
|
|
22
|
+
"click>=8.2.1",
|
|
23
23
|
"deepdiff>=8.1.1",
|
|
24
24
|
"distro>=1.9.0",
|
|
25
25
|
"gitpython>=3.1.44",
|
|
@@ -27,9 +27,8 @@ dependencies = [
|
|
|
27
27
|
"psutil>=6.1.1",
|
|
28
28
|
"pyyaml>=6.0.2",
|
|
29
29
|
"rich>=13.9.4",
|
|
30
|
-
"typer>=0.
|
|
31
|
-
"navdict>=0.
|
|
32
|
-
|
|
30
|
+
"typer>=0.16.0",
|
|
31
|
+
"navdict>=0.5.9",
|
|
33
32
|
# Python 3.9 specific dependencies
|
|
34
33
|
"numpy==1.26.4; python_version == '3.9'",
|
|
35
34
|
"pandas==1.5.1; python_version == '3.9'",
|
|
@@ -38,10 +37,12 @@ dependencies = [
|
|
|
38
37
|
"numpy>=2.1; python_version >= '3.10'",
|
|
39
38
|
"pandas>=2.2.0; python_version >= '3.10'",
|
|
40
39
|
"pyzmq>=25.1.0; python_version >= '3.10'",
|
|
41
|
-
|
|
42
40
|
# Python 3.10+ entrypoints interface changed
|
|
43
41
|
"importlib_metadata>=4.6.0; python_version <= '3.11'",
|
|
44
42
|
"influxdb3-python",
|
|
43
|
+
"duckdb>=1.3.1",
|
|
44
|
+
"requests>=2.32.4",
|
|
45
|
+
"psycopg>=3.2.9",
|
|
45
46
|
]
|
|
46
47
|
|
|
47
48
|
[project.scripts]
|
|
@@ -57,7 +58,7 @@ cgse-common = "cgse_common:settings.yaml"
|
|
|
57
58
|
[tool.pytest.ini_options]
|
|
58
59
|
pythonpath = "src"
|
|
59
60
|
testpaths = ["tests"]
|
|
60
|
-
addopts = "-
|
|
61
|
+
addopts = "-ra --cov --cov-branch --cov-report html"
|
|
61
62
|
log_cli = true
|
|
62
63
|
log_cli_level = "INFO"
|
|
63
64
|
filterwarnings = [
|
|
Binary file
|
|
@@ -85,7 +85,7 @@ class SortedCommandGroup(TyperGroup):
|
|
|
85
85
|
return sorted(commands, key=get_command_priority)
|
|
86
86
|
|
|
87
87
|
|
|
88
|
-
app = typer.Typer(add_completion=True, cls=SortedCommandGroup
|
|
88
|
+
app = typer.Typer(add_completion=True, cls=SortedCommandGroup)
|
|
89
89
|
|
|
90
90
|
|
|
91
91
|
@app.command()
|
|
@@ -121,22 +121,33 @@ def version(ctx: typer.Context):
|
|
|
121
121
|
)
|
|
122
122
|
|
|
123
123
|
|
|
124
|
+
def subcommand_callback(ctx: typer.Context):
|
|
125
|
+
"""Normal callback."""
|
|
126
|
+
if ctx.invoked_subcommand is None:
|
|
127
|
+
typer.echo("No command specified:")
|
|
128
|
+
typer.echo(ctx.get_help())
|
|
129
|
+
raise typer.Exit()
|
|
130
|
+
|
|
131
|
+
|
|
124
132
|
def build_app():
|
|
125
133
|
global app
|
|
126
134
|
|
|
135
|
+
# rich.print("Available command groups:", entry_points("cgse.command"))
|
|
136
|
+
|
|
127
137
|
for ep in entry_points("cgse.command"):
|
|
128
138
|
try:
|
|
129
139
|
obj = ep.load()
|
|
130
140
|
if isinstance(obj, typer.Typer):
|
|
131
|
-
|
|
141
|
+
obj.callback(invoke_without_command=True)(subcommand_callback)
|
|
142
|
+
app.add_typer(obj, name=ep.name)
|
|
132
143
|
else:
|
|
133
|
-
app.command()(
|
|
144
|
+
app.command()(obj)
|
|
134
145
|
except Exception as exc:
|
|
135
146
|
app.command()(broken_command(ep.name, ep.module, exc))
|
|
136
147
|
|
|
137
148
|
cgse_eps = HierarchicalEntryPoints("cgse.service")
|
|
138
149
|
|
|
139
|
-
# rich.print("Available groups:", cgse_eps.get_all_groups())
|
|
150
|
+
# rich.print("Available services groups:", cgse_eps.get_all_groups())
|
|
140
151
|
|
|
141
152
|
for group in cgse_eps.get_all_groups():
|
|
142
153
|
for ep in entry_points(group):
|
|
@@ -145,12 +156,14 @@ def build_app():
|
|
|
145
156
|
app.add_typer(ep.load(), name=ep.name)
|
|
146
157
|
else:
|
|
147
158
|
command_group = snake_to_title(group.split(".")[-1])
|
|
148
|
-
|
|
159
|
+
plugin_app: typer.Typer = ep.load()
|
|
160
|
+
plugin_app.callback(invoke_without_command=True)(subcommand_callback)
|
|
161
|
+
app.add_typer(plugin_app, name=ep.name, rich_help_panel=command_group)
|
|
149
162
|
except Exception as exc:
|
|
150
163
|
app.command()(broken_command(ep.name, ep.module, exc))
|
|
151
164
|
|
|
152
165
|
|
|
153
|
-
@app.callback(
|
|
166
|
+
@app.callback(invoke_without_command=True)
|
|
154
167
|
def main(ctx: typer.Context, verbose: bool = False):
|
|
155
168
|
"""
|
|
156
169
|
The `cgse` command is used to:
|
|
@@ -167,6 +180,9 @@ def main(ctx: typer.Context, verbose: bool = False):
|
|
|
167
180
|
|
|
168
181
|
ctx.obj = AppState(verbose=verbose)
|
|
169
182
|
|
|
183
|
+
if ctx.invoked_subcommand is None:
|
|
184
|
+
# print("Try 'cgse --help' for a list of commands.")
|
|
185
|
+
typer.echo(ctx.get_help())
|
|
170
186
|
|
|
171
187
|
build_app()
|
|
172
188
|
|
|
@@ -145,46 +145,6 @@ def stringify_function_call(function_info: dict) -> str:
|
|
|
145
145
|
return result
|
|
146
146
|
|
|
147
147
|
|
|
148
|
-
def dry_run(func: Callable) -> Callable:
|
|
149
|
-
"""This decorator prepares the function to handle a dry run.
|
|
150
|
-
|
|
151
|
-
A dry run is used to check the logic of an instrument commanding script without
|
|
152
|
-
actually executing the instrument commands. The commands are instead added to the
|
|
153
|
-
command sequence in the global state.
|
|
154
|
-
|
|
155
|
-
Args:
|
|
156
|
-
func: the function that needs to be executed
|
|
157
|
-
|
|
158
|
-
Returns:
|
|
159
|
-
A wrapper around the given function.
|
|
160
|
-
"""
|
|
161
|
-
|
|
162
|
-
@functools.wraps(func)
|
|
163
|
-
def func_wrapper(self, *args, **kwargs):
|
|
164
|
-
from egse.state import GlobalState # prevent circular import
|
|
165
|
-
|
|
166
|
-
if GlobalState.dry_run:
|
|
167
|
-
if callable(func) and func.__name__ == "client_call":
|
|
168
|
-
# This client_call function takes an additional argument which is the Proxy.
|
|
169
|
-
# the Proxy is not part of the CommandExecution signature and shall be removed
|
|
170
|
-
# FIXME: do we introduce a memory leak here by adding 'self' to this GlobalState?
|
|
171
|
-
args = args[1:]
|
|
172
|
-
try:
|
|
173
|
-
self.validate_arguments(*args, **kwargs)
|
|
174
|
-
except CommandError as e_ce:
|
|
175
|
-
GlobalState.add_command(InvalidCommandExecution(e_ce, self, *args, **kwargs))
|
|
176
|
-
else:
|
|
177
|
-
GlobalState.add_command(CommandExecution(self, *args, **kwargs))
|
|
178
|
-
else:
|
|
179
|
-
FunctionExecution = namedtuple("FunctionExecution", ["name", "args", "kwargs"])
|
|
180
|
-
GlobalState.add_command(FunctionExecution(func.__name__, args, kwargs))
|
|
181
|
-
return Success("Command execution appended to command sequence, function not executed in dry_run.")
|
|
182
|
-
else:
|
|
183
|
-
return func(self, *args, **kwargs)
|
|
184
|
-
|
|
185
|
-
return func_wrapper
|
|
186
|
-
|
|
187
|
-
|
|
188
148
|
def parse_format_string(fstring):
|
|
189
149
|
"""
|
|
190
150
|
Parse and decode the format string.
|
|
@@ -479,7 +439,6 @@ class Command:
|
|
|
479
439
|
|
|
480
440
|
|
|
481
441
|
class ClientServerCommand(Command):
|
|
482
|
-
@dry_run
|
|
483
442
|
def client_call(self, other: type, *args: tuple, **kwargs: dict) -> Any:
|
|
484
443
|
"""
|
|
485
444
|
This method is called at the client side. It is used by the Proxy
|
|
@@ -22,12 +22,15 @@ from urllib3.exceptions import NewConnectionError
|
|
|
22
22
|
from egse.decorators import retry
|
|
23
23
|
from egse.decorators import retry_with_exponential_backoff
|
|
24
24
|
from egse.listener import Listeners
|
|
25
|
+
from egse.metrics import get_metrics_repo
|
|
25
26
|
from egse.registry.client import RegistryClient
|
|
26
27
|
from egse.signal import FileBasedSignaling
|
|
27
28
|
from egse.system import SignalCatcher
|
|
28
29
|
from egse.system import camel_to_kebab
|
|
29
30
|
from egse.system import camel_to_snake
|
|
31
|
+
from egse.system import str_to_datetime
|
|
30
32
|
from egse.system import time_in_ms
|
|
33
|
+
from egse.system import type_name
|
|
31
34
|
from egse.zmq_ser import get_port_number
|
|
32
35
|
|
|
33
36
|
try:
|
|
@@ -47,9 +50,6 @@ from egse.system import get_average_execution_times
|
|
|
47
50
|
from egse.system import get_full_classname
|
|
48
51
|
from egse.system import get_host_ip
|
|
49
52
|
from egse.system import save_average_execution_time
|
|
50
|
-
from influxdb_client_3 import InfluxDBClient3
|
|
51
|
-
from influxdb_client_3.write_client.domain.write_precision import WritePrecision
|
|
52
|
-
from influxdb_client_3 import Point
|
|
53
53
|
|
|
54
54
|
_LOGGER = logging.getLogger(__name__)
|
|
55
55
|
|
|
@@ -179,12 +179,15 @@ class ControlServer(metaclass=abc.ABCMeta):
|
|
|
179
179
|
|
|
180
180
|
token = os.getenv("INFLUXDB3_AUTH_TOKEN")
|
|
181
181
|
project = os.getenv("PROJECT")
|
|
182
|
-
self.metrics_time_precision = WritePrecision.MS
|
|
183
182
|
|
|
184
183
|
if project and token:
|
|
185
|
-
self.
|
|
184
|
+
self.metrics_client = get_metrics_repo(
|
|
185
|
+
"influxdb", {"host": "http://localhost:8181", "database": project, "token": token}
|
|
186
|
+
)
|
|
187
|
+
# self.metrics_client = get_metrics_repo("duckdb", {"db_path": "duckdb_metrics.db", "table_name": "cs_timeseries"})
|
|
188
|
+
self.metrics_client.connect()
|
|
186
189
|
else:
|
|
187
|
-
self.
|
|
190
|
+
self.metrics_client = None
|
|
188
191
|
_LOGGER.warning(
|
|
189
192
|
"INFLUXDB3_AUTH_TOKEN and/or PROJECT environment variable is not set. "
|
|
190
193
|
"Metrics will not be propagated to InfluxDB."
|
|
@@ -545,7 +548,7 @@ class ControlServer(metaclass=abc.ABCMeta):
|
|
|
545
548
|
except Exception as exc:
|
|
546
549
|
_LOGGER.error(
|
|
547
550
|
textwrap.dedent(
|
|
548
|
-
f"""
|
|
551
|
+
f"""{type_name(exc)}
|
|
549
552
|
An Exception occurred while collecting housekeeping from the device to be stored in {self.get_storage_mnemonic()}.
|
|
550
553
|
This might be a temporary problem, still needs to be looked into:
|
|
551
554
|
|
|
@@ -659,20 +662,21 @@ class ControlServer(metaclass=abc.ABCMeta):
|
|
|
659
662
|
return
|
|
660
663
|
|
|
661
664
|
try:
|
|
662
|
-
if self.
|
|
663
|
-
|
|
664
|
-
"measurement": origin.lower(),
|
|
665
|
-
"tags": {"site_id": SITE_ID, "origin": origin},
|
|
666
|
-
"fields":
|
|
667
|
-
"time": hk["timestamp"],
|
|
665
|
+
if self.metrics_client:
|
|
666
|
+
point = {
|
|
667
|
+
"measurement": origin.lower(),
|
|
668
|
+
"tags": {"site_id": SITE_ID, "origin": origin},
|
|
669
|
+
"fields": {hk_name.lower(): hk[hk_name] for hk_name in hk if hk_name != "timestamp"},
|
|
670
|
+
"time": str_to_datetime(hk["timestamp"]),
|
|
668
671
|
}
|
|
669
|
-
|
|
670
|
-
self.client.write(point)
|
|
672
|
+
self.metrics_client.write(point)
|
|
671
673
|
else:
|
|
672
|
-
_LOGGER.warning(
|
|
674
|
+
_LOGGER.warning(
|
|
675
|
+
f"Could not write {origin} metrics to the time series database (self.metrics_client is None)."
|
|
676
|
+
)
|
|
673
677
|
except NewConnectionError:
|
|
674
678
|
_LOGGER.warning(
|
|
675
|
-
f"No connection to
|
|
679
|
+
f"No connection to the time series database could be established to propagate {origin} metrics. Check "
|
|
676
680
|
f"whether this service is (still) running."
|
|
677
681
|
)
|
|
678
682
|
|
|
@@ -52,7 +52,6 @@ from egse.listener import Event
|
|
|
52
52
|
from egse.listener import EventInterface
|
|
53
53
|
from egse.protocol import CommandProtocol
|
|
54
54
|
from egse.proxy import Proxy
|
|
55
|
-
from egse.response import Failure
|
|
56
55
|
from egse.settings import Settings
|
|
57
56
|
from egse.system import SignalCatcher
|
|
58
57
|
from egse.system import attrdict
|
|
@@ -648,6 +647,10 @@ def start_dev():
|
|
|
648
647
|
if not data:
|
|
649
648
|
_LOGGER.info("Connection closed by peer, waiting for connection..")
|
|
650
649
|
break # connection closed by peer
|
|
650
|
+
if data.decode().strip() == "QUIT":
|
|
651
|
+
_LOGGER.info("QUIT command received, terminating...")
|
|
652
|
+
quit_request = True
|
|
653
|
+
break
|
|
651
654
|
if (response := process_command(data.decode().rstrip())) is not None:
|
|
652
655
|
response = f"{response}\r\n".encode()
|
|
653
656
|
conn.sendall(response)
|
|
@@ -667,6 +670,18 @@ def start_dev():
|
|
|
667
670
|
_LOGGER.info("Dummy Device terminated.")
|
|
668
671
|
|
|
669
672
|
|
|
673
|
+
@app.command()
|
|
674
|
+
def stop_dev():
|
|
675
|
+
multiprocessing.current_process().name = "dummy_dev"
|
|
676
|
+
|
|
677
|
+
_LOGGER.info("Stopping the Dummy Device simulator")
|
|
678
|
+
|
|
679
|
+
dev = DummyDeviceEthernetInterface(DEV_HOST, DEV_PORT)
|
|
680
|
+
dev.connect()
|
|
681
|
+
dev.write("QUIT\n")
|
|
682
|
+
dev.disconnect()
|
|
683
|
+
|
|
684
|
+
|
|
670
685
|
COMMAND_ACTIONS_RESPONSES = {"info": (None, f"Dummy Device {__version__}"), "get_value": (None, random.random)}
|
|
671
686
|
|
|
672
687
|
|
|
@@ -1,14 +1,31 @@
|
|
|
1
|
+
__all__ = [
|
|
2
|
+
"DataPoint",
|
|
3
|
+
"TimeSeriesRepository",
|
|
4
|
+
"define_metrics",
|
|
5
|
+
"get_metrics_repo",
|
|
6
|
+
]
|
|
7
|
+
|
|
1
8
|
import logging
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import Any
|
|
2
11
|
from typing import Optional
|
|
12
|
+
from typing import Protocol
|
|
13
|
+
from typing import Self
|
|
3
14
|
|
|
4
15
|
import numpy as np
|
|
5
16
|
from prometheus_client import Gauge
|
|
6
17
|
|
|
7
18
|
from egse.hk import TmDictionaryColumns
|
|
19
|
+
from egse.plugin import load_plugins_fn
|
|
8
20
|
from egse.settings import Settings
|
|
9
|
-
from egse.setup import
|
|
21
|
+
from egse.setup import Setup
|
|
22
|
+
from egse.setup import SetupError
|
|
23
|
+
from egse.setup import load_setup
|
|
24
|
+
from egse.system import format_datetime
|
|
25
|
+
from egse.system import str_to_datetime
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger("egse.metrics")
|
|
10
28
|
|
|
11
|
-
LOGGER = logging.getLogger(__name__)
|
|
12
29
|
SITE_ID = Settings.load("SITE").ID
|
|
13
30
|
|
|
14
31
|
|
|
@@ -64,7 +81,7 @@ def define_metrics(origin: str, dashboard: str = None, use_site: bool = False, s
|
|
|
64
81
|
try:
|
|
65
82
|
metrics[syn_name] = Gauge(syn_name, description)
|
|
66
83
|
except ValueError:
|
|
67
|
-
|
|
84
|
+
logger.warning(f"ValueError for {syn_name}")
|
|
68
85
|
|
|
69
86
|
return metrics
|
|
70
87
|
|
|
@@ -100,4 +117,105 @@ def update_metrics(metrics: dict, updates: dict):
|
|
|
100
117
|
else:
|
|
101
118
|
metrics[metric_name].set(float(value))
|
|
102
119
|
except KeyError:
|
|
103
|
-
|
|
120
|
+
logger.warning(f"Unknown metric name: {metric_name=}")
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class PointLike(Protocol):
|
|
124
|
+
@staticmethod
|
|
125
|
+
def measurement(measurement_name: str) -> "PointLike": ...
|
|
126
|
+
|
|
127
|
+
def tag(self, key, value) -> Self: ...
|
|
128
|
+
|
|
129
|
+
def field(self, field, value) -> Self: ...
|
|
130
|
+
|
|
131
|
+
def time(self, time) -> Self: ...
|
|
132
|
+
|
|
133
|
+
def as_dict(self) -> dict: ...
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class DataPoint(PointLike):
|
|
137
|
+
def __init__(self, measurement_name: str):
|
|
138
|
+
self.measurement: str = measurement_name
|
|
139
|
+
self.tags: dict[str, str] = {}
|
|
140
|
+
self.fields: dict[str, Any] = {}
|
|
141
|
+
self.timestamp: int | str = format_datetime()
|
|
142
|
+
|
|
143
|
+
def as_dict(self):
|
|
144
|
+
if isinstance(self.timestamp, str):
|
|
145
|
+
timestamp = str_to_datetime(self.timestamp).timestamp()
|
|
146
|
+
else:
|
|
147
|
+
timestamp = self.timestamp
|
|
148
|
+
|
|
149
|
+
return {
|
|
150
|
+
"measurement": self.measurement,
|
|
151
|
+
"tags": self.tags,
|
|
152
|
+
"fields": self.fields,
|
|
153
|
+
"time": timestamp,
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
@staticmethod
|
|
157
|
+
def measurement(measurement_name):
|
|
158
|
+
p = DataPoint(measurement_name)
|
|
159
|
+
return p
|
|
160
|
+
|
|
161
|
+
def tag(self, key, value):
|
|
162
|
+
self.tags[key] = value
|
|
163
|
+
return self
|
|
164
|
+
|
|
165
|
+
def field(self, field, value):
|
|
166
|
+
self.fields[field] = value
|
|
167
|
+
return self
|
|
168
|
+
|
|
169
|
+
def time(self, time):
|
|
170
|
+
self.timestamp = time
|
|
171
|
+
return self
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class TimeSeriesRepository(Protocol):
|
|
175
|
+
def connect(self) -> None: ...
|
|
176
|
+
|
|
177
|
+
def write(self, points: PointLike | dict | list[PointLike | dict]) -> None: ...
|
|
178
|
+
|
|
179
|
+
def query(self, query_str: str, mode: str) -> Any: ...
|
|
180
|
+
|
|
181
|
+
def get_table_names(self) -> list[str]: ...
|
|
182
|
+
|
|
183
|
+
def get_column_names(self, table_name: str) -> list[str]: ...
|
|
184
|
+
|
|
185
|
+
def get_values_last_hours(self, table_name: str, column_name: str, hours: int, mode: str) -> Any: ...
|
|
186
|
+
|
|
187
|
+
def get_values_in_range(
|
|
188
|
+
self, table_name: str, column_name: str, start_time: str, end_time: str, mode: str
|
|
189
|
+
) -> Any: ...
|
|
190
|
+
|
|
191
|
+
def close(self) -> None: ...
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def get_metrics_repo(plugin_name: str, config: dict[str, Any]) -> TimeSeriesRepository:
|
|
195
|
+
"""
|
|
196
|
+
Create a TimeSeriesRepository instance from a plugin.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
plugin_name: Name of the plugin (without .py extension)
|
|
200
|
+
config: Configuration parameters for the repository
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
Configured TimeSeriesRepository instance.
|
|
204
|
+
|
|
205
|
+
Raises:
|
|
206
|
+
ModuleNotFoundError: If plugin not found
|
|
207
|
+
NotImplementedError: If plugin is missing get_repository_class()
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
package_name = "egse.plugins"
|
|
211
|
+
plugins = load_plugins_fn(f"{plugin_name}.py", package_name)
|
|
212
|
+
|
|
213
|
+
if plugin_name in plugins:
|
|
214
|
+
plugin = plugins[plugin_name]
|
|
215
|
+
if hasattr(plugin, "get_repository_class"):
|
|
216
|
+
repo_class = plugin.get_repository_class()
|
|
217
|
+
else:
|
|
218
|
+
raise NotImplementedError(f"Missing 'get_repository_class()` function in metrics plugin {plugin_name}.")
|
|
219
|
+
return repo_class(**config)
|
|
220
|
+
else:
|
|
221
|
+
raise ModuleNotFoundError(f"No plugin found for {plugin_name} in {package_name}.")
|