cgse 0.16.7__tar.gz → 0.16.9__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.
Files changed (540) hide show
  1. {cgse-0.16.7 → cgse-0.16.9}/PKG-INFO +1 -1
  2. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/pyproject.toml +1 -1
  3. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/pyproject.toml +1 -1
  4. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/pyproject.toml +1 -1
  5. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/proxy.py +15 -7
  6. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/registry/client.py +52 -126
  7. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/registry/server.py +2 -0
  8. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/storage/storage_cs.py +2 -7
  9. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_registry_service.py +0 -67
  10. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/pyproject.toml +1 -1
  11. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/pyproject.toml +1 -1
  12. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/pyproject.toml +1 -1
  13. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/pyproject.toml +1 -1
  14. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
  15. {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-fits/pyproject.toml +1 -1
  16. {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-hdf5/pyproject.toml +1 -1
  17. {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-spw/pyproject.toml +1 -1
  18. {cgse-0.16.7 → cgse-0.16.9}/pyproject.toml +1 -1
  19. {cgse-0.16.7 → cgse-0.16.9}/service_registry.db +0 -0
  20. cgse-0.16.9/service_registry.db-shm +0 -0
  21. cgse-0.16.9/service_registry.db-wal +0 -0
  22. {cgse-0.16.7 → cgse-0.16.9}/.github/workflows/ruff-format-check.yaml +0 -0
  23. {cgse-0.16.7 → cgse-0.16.9}/.gitignore +0 -0
  24. {cgse-0.16.7 → cgse-0.16.9}/README.md +0 -0
  25. {cgse-0.16.7 → cgse-0.16.9}/buffer_vat.log +0 -0
  26. {cgse-0.16.7 → cgse-0.16.9}/buffer_vat.png +0 -0
  27. {cgse-0.16.7 → cgse-0.16.9}/bump.py +0 -0
  28. {cgse-0.16.7 → cgse-0.16.9}/conftest.py +0 -0
  29. {cgse-0.16.7 → cgse-0.16.9}/docs/api/bits.md +0 -0
  30. {cgse-0.16.7 → cgse-0.16.9}/docs/api/calibration.md +0 -0
  31. {cgse-0.16.7 → cgse-0.16.9}/docs/api/command.md +0 -0
  32. {cgse-0.16.7 → cgse-0.16.9}/docs/api/config.md +0 -0
  33. {cgse-0.16.7 → cgse-0.16.9}/docs/api/control.md +0 -0
  34. {cgse-0.16.7 → cgse-0.16.9}/docs/api/counter.md +0 -0
  35. {cgse-0.16.7 → cgse-0.16.9}/docs/api/decorators.md +0 -0
  36. {cgse-0.16.7 → cgse-0.16.9}/docs/api/device.md +0 -0
  37. {cgse-0.16.7 → cgse-0.16.9}/docs/api/dicts.md +0 -0
  38. {cgse-0.16.7 → cgse-0.16.9}/docs/api/dummy.md +0 -0
  39. {cgse-0.16.7 → cgse-0.16.9}/docs/api/env.md +0 -0
  40. {cgse-0.16.7 → cgse-0.16.9}/docs/api/exceptions.md +0 -0
  41. {cgse-0.16.7 → cgse-0.16.9}/docs/api/heartbeat.md +0 -0
  42. {cgse-0.16.7 → cgse-0.16.9}/docs/api/hk.md +0 -0
  43. {cgse-0.16.7 → cgse-0.16.9}/docs/api/index.md +0 -0
  44. {cgse-0.16.7 → cgse-0.16.9}/docs/api/listener.md +0 -0
  45. {cgse-0.16.7 → cgse-0.16.9}/docs/api/metrics.md +0 -0
  46. {cgse-0.16.7 → cgse-0.16.9}/docs/api/mixin.md +0 -0
  47. {cgse-0.16.7 → cgse-0.16.9}/docs/api/monitoring.md +0 -0
  48. {cgse-0.16.7 → cgse-0.16.9}/docs/api/observer.md +0 -0
  49. {cgse-0.16.7 → cgse-0.16.9}/docs/api/obsid.md +0 -0
  50. {cgse-0.16.7 → cgse-0.16.9}/docs/api/persistence.md +0 -0
  51. {cgse-0.16.7 → cgse-0.16.9}/docs/api/plugin.md +0 -0
  52. {cgse-0.16.7 → cgse-0.16.9}/docs/api/process.md +0 -0
  53. {cgse-0.16.7 → cgse-0.16.9}/docs/api/reload.md +0 -0
  54. {cgse-0.16.7 → cgse-0.16.9}/docs/api/settings.md +0 -0
  55. {cgse-0.16.7 → cgse-0.16.9}/docs/api/setup.md +0 -0
  56. {cgse-0.16.7 → cgse-0.16.9}/docs/api/system.md +0 -0
  57. {cgse-0.16.7 → cgse-0.16.9}/docs/custom_theme/main.html +0 -0
  58. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/coding_style.md +0 -0
  59. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/docs.md +0 -0
  60. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/index.md +0 -0
  61. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/installation.md +0 -0
  62. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/monitoring.md +0 -0
  63. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/monorepo.md +0 -0
  64. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/nox.md +0 -0
  65. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/plugins.md +0 -0
  66. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/project-configuration.md +0 -0
  67. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/unit_testing.md +0 -0
  68. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/uv.md +0 -0
  69. {cgse-0.16.7 → cgse-0.16.9}/docs/dev_guide/versioning.md +0 -0
  70. {cgse-0.16.7 → cgse-0.16.9}/docs/getting_started.md +0 -0
  71. {cgse-0.16.7 → cgse-0.16.9}/docs/help.md +0 -0
  72. {cgse-0.16.7 → cgse-0.16.9}/docs/images/cli-cgse.png +0 -0
  73. {cgse-0.16.7 → cgse-0.16.9}/docs/images/github-fork-clone-dark.png +0 -0
  74. {cgse-0.16.7 → cgse-0.16.9}/docs/images/github-fork-clone.png +0 -0
  75. {cgse-0.16.7 → cgse-0.16.9}/docs/images/grafana-queries.png +0 -0
  76. {cgse-0.16.7 → cgse-0.16.9}/docs/images/icons/cgse-logo-blue.svg +0 -0
  77. {cgse-0.16.7 → cgse-0.16.9}/docs/images/icons/cgse-logo.svg +0 -0
  78. {cgse-0.16.7 → cgse-0.16.9}/docs/index.md +0 -0
  79. {cgse-0.16.7 → cgse-0.16.9}/docs/initialize.md +0 -0
  80. {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-common/images/load_methods.png +0 -0
  81. {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-common/index.md +0 -0
  82. {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-common/settings.md +0 -0
  83. {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-common/setup.md +0 -0
  84. {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-coordinates/index.md +0 -0
  85. {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-core/index.md +0 -0
  86. {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-core/notifyhub.md +0 -0
  87. {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-core/registry.md +0 -0
  88. {cgse-0.16.7 → cgse-0.16.9}/docs/libs/cgse-gui/index.md +0 -0
  89. {cgse-0.16.7 → cgse-0.16.9}/docs/libs/index.md +0 -0
  90. {cgse-0.16.7 → cgse-0.16.9}/docs/package_list.md +0 -0
  91. {cgse-0.16.7 → cgse-0.16.9}/docs/projects/cgse-tools.md +0 -0
  92. {cgse-0.16.7 → cgse-0.16.9}/docs/projects/index.md +0 -0
  93. {cgse-0.16.7 → cgse-0.16.9}/docs/projects/symetrie-hexapod.md +0 -0
  94. {cgse-0.16.7 → cgse-0.16.9}/docs/roadmap.md +0 -0
  95. {cgse-0.16.7 → cgse-0.16.9}/docs/stylesheets/custom.css +0 -0
  96. {cgse-0.16.7 → cgse-0.16.9}/docs/stylesheets/extra.css +0 -0
  97. {cgse-0.16.7 → cgse-0.16.9}/docs/tutorial.md +0 -0
  98. {cgse-0.16.7 → cgse-0.16.9}/docs/user_guide/cli.md +0 -0
  99. {cgse-0.16.7 → cgse-0.16.9}/docs/user_guide/index.md +0 -0
  100. {cgse-0.16.7 → cgse-0.16.9}/duckdb_metrics.db +0 -0
  101. {cgse-0.16.7 → cgse-0.16.9}/duckdb_metrics.db.wal +0 -0
  102. {cgse-0.16.7 → cgse-0.16.9}/identifier.sqlite +0 -0
  103. {cgse-0.16.7 → cgse-0.16.9}/justfile +0 -0
  104. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/README.md +0 -0
  105. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/justfile +0 -0
  106. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/noxfile.py +0 -0
  107. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/service_registry.db +0 -0
  108. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/cgse_common/__init__.py +0 -0
  109. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/cgse_common/cgse.py +0 -0
  110. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
  111. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/bits.py +0 -0
  112. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/calibration.py +0 -0
  113. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/config.py +0 -0
  114. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/counter.py +0 -0
  115. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/decorators.py +0 -0
  116. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/device.py +0 -0
  117. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/dicts.py +0 -0
  118. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/env.py +0 -0
  119. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/exceptions.py +0 -0
  120. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/heartbeat.py +0 -0
  121. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/hk.py +0 -0
  122. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/log.py +0 -0
  123. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/metrics.py +0 -0
  124. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/observer.py +0 -0
  125. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/obsid.py +0 -0
  126. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/persistence.py +0 -0
  127. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/plugin.py +0 -0
  128. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/plugins/metrics/duckdb.py +0 -0
  129. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/plugins/metrics/influxdb.py +0 -0
  130. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/plugins/metrics/timescaledb.py +0 -0
  131. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/process.py +0 -0
  132. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/py.typed +0 -0
  133. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/randomwalk.py +0 -0
  134. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/ratelimit.py +0 -0
  135. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/reload.py +0 -0
  136. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/resource.py +0 -0
  137. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/response.py +0 -0
  138. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/scpi.py +0 -0
  139. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/settings.py +0 -0
  140. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/settings.yaml +0 -0
  141. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/setup.py +0 -0
  142. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/signal.py +0 -0
  143. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/socketdevice.py +0 -0
  144. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/state.py +0 -0
  145. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/system.py +0 -0
  146. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/task.py +0 -0
  147. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/version.py +0 -0
  148. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/src/egse/zmq_ser.py +0 -0
  149. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/conftest.py +0 -0
  150. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/COPYING +0 -0
  151. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
  152. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
  153. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
  154. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
  155. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
  156. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
  157. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
  158. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
  159. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/IAS/README.md +0 -0
  160. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/INTA/README.md +0 -0
  161. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
  162. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
  163. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
  164. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
  165. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
  166. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
  167. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
  168. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
  169. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
  170. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
  171. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
  172. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
  173. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/command.yaml +0 -0
  174. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
  175. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
  176. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
  177. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
  178. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
  179. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/new_local_settings.yaml +0 -0
  180. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
  181. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/icons/hourglass.svg +0 -0
  182. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
  183. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/icons/soap_sponge.svg +0 -0
  184. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
  185. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
  186. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
  187. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
  188. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/empty_process.py +0 -0
  189. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/handle_sigterm.py +0 -0
  190. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/process_with_children.py +0 -0
  191. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/raise_value_error.py +0 -0
  192. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/void-0.py +0 -0
  193. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/scripts/void-1.py +0 -0
  194. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_bits.py +0 -0
  195. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_config.py +0 -0
  196. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_decorators.py +0 -0
  197. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_device.py +0 -0
  198. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_env.py +0 -0
  199. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_fixtures.py +0 -0
  200. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_hk.py +0 -0
  201. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_influxdb_plugin.py +0 -0
  202. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_log.py +0 -0
  203. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_metrics.py +0 -0
  204. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_plugin.py +0 -0
  205. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_process.py +0 -0
  206. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_ratelimit.py +0 -0
  207. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_resource.py +0 -0
  208. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_response.py +0 -0
  209. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_settings.py +0 -0
  210. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_setup.py +0 -0
  211. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_signal.py +0 -0
  212. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_state.py +0 -0
  213. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_system.py +0 -0
  214. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_task.py +0 -0
  215. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-common/tests/test_zmq_ser.py +0 -0
  216. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/README.md +0 -0
  217. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/cgse_coordinates/__init__.py +0 -0
  218. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/cgse_coordinates/settings.yaml +0 -0
  219. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
  220. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
  221. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
  222. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
  223. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
  224. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
  225. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
  226. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
  227. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
  228. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
  229. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_avoidance.py +0 -0
  230. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_coordinates_plot.py +0 -0
  231. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_coordinates_serialize.py +0 -0
  232. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_point.py +0 -0
  233. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_ref_model.py +0 -0
  234. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_reference_frames.py +0 -0
  235. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-coordinates/tests/test_refmodel.py +0 -0
  236. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/.envrc.disabled +0 -0
  237. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/README.md +0 -0
  238. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/service_registry.db +0 -0
  239. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
  240. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/_start.py +0 -0
  241. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/_status.py +0 -0
  242. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/_stop.py +0 -0
  243. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/cgse_explore.py +0 -0
  244. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/services.py +0 -0
  245. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/cgse_core/settings.yaml +0 -0
  246. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/_setup_core.py +0 -0
  247. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/async_control.py +0 -0
  248. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/async_control_claude.py +0 -0
  249. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/command.py +0 -0
  250. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/confman/__init__.py +0 -0
  251. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
  252. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
  253. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/confman/confman_cs.py +0 -0
  254. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/connect-todo.py +0 -0
  255. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/connect.py +0 -0
  256. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/control.py +0 -0
  257. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/dummy.py +0 -0
  258. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/busy.svg +0 -0
  259. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/operational-mode.svg +0 -0
  260. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/pm_ui.svg +0 -0
  261. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/simulator-mode.svg +0 -0
  262. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/start-process-button.svg +0 -0
  263. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/stop-process-button.svg +0 -0
  264. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/icons/user-interface.svg +0 -0
  265. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/listener.py +0 -0
  266. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/logger/__init__.py +0 -0
  267. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
  268. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/logger/log_cs.py +0 -0
  269. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/metricshub/__init__.py +0 -0
  270. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/metricshub/server.py +0 -0
  271. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/mixin.py +0 -0
  272. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/monitoring.py +0 -0
  273. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/__init__.py +0 -0
  274. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/client.py +0 -0
  275. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/event.py +0 -0
  276. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/server.py +0 -0
  277. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/services.py +0 -0
  278. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/notifyhub/test.py +0 -0
  279. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/procman/__init__.py +0 -0
  280. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
  281. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/procman/procman_cs.py +0 -0
  282. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/procman/procman_protocol.py +0 -0
  283. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/procman/procman_ui.py +0 -0
  284. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/protocol.py +0 -0
  285. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/registry/__init__.py +0 -0
  286. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/registry/backend.py +0 -0
  287. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/registry/service.py +0 -0
  288. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/services.py +0 -0
  289. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/services.yaml +0 -0
  290. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/storage/__init__.py +0 -0
  291. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
  292. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
  293. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
  294. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/conftest.py +0 -0
  295. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
  296. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/fixtures/default_env.py +0 -0
  297. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/fixtures/helpers.py +0 -0
  298. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/fixtures/services.py +0 -0
  299. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/script_subscribe_to_notifyhub.py +0 -0
  300. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/script_test_async_registry_client.py +0 -0
  301. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/script_test_registry_client_server.py +0 -0
  302. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/script_test_service_registry_server.py +0 -0
  303. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/script_test_sync_registry_client.py +0 -0
  304. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/services.py +0 -0
  305. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/stress_test_registry_server.py +0 -0
  306. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_async_control.py +0 -0
  307. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_client_server_interaction.py +0 -0
  308. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_cm_cs.py +0 -0
  309. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_command.py +0 -0
  310. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_confman_setups.py +0 -0
  311. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_connect.py +0 -0
  312. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_control.py +0 -0
  313. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_dummy.py +0 -0
  314. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_event_notification.py +0 -0
  315. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_extensions.py +0 -0
  316. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_listener.py +0 -0
  317. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_logger.py +0 -0
  318. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_mixin.py +0 -0
  319. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_notify_hub.py +0 -0
  320. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_protocol.py +0 -0
  321. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_registry_backend.py +0 -0
  322. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_server_running.py +0 -0
  323. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_server_running_with_fixture.py +0 -0
  324. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_settings_core.py +0 -0
  325. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-core/tests/test_zmq_microservice.py +0 -0
  326. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/README.md +0 -0
  327. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
  328. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
  329. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
  330. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
  331. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
  332. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
  333. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
  334. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
  335. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
  336. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
  337. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
  338. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
  339. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
  340. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
  341. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
  342. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
  343. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
  344. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
  345. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
  346. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
  347. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
  348. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
  349. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
  350. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
  351. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
  352. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
  353. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
  354. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
  355. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
  356. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
  357. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
  358. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
  359. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
  360. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
  361. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
  362. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
  363. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
  364. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
  365. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
  366. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
  367. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
  368. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
  369. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
  370. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
  371. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
  372. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
  373. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
  374. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
  375. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
  376. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
  377. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
  378. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
  379. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
  380. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
  381. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
  382. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
  383. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
  384. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
  385. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
  386. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
  387. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
  388. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
  389. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
  390. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
  391. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
  392. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
  393. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
  394. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
  395. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
  396. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
  397. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
  398. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
  399. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
  400. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
  401. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
  402. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
  403. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
  404. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
  405. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
  406. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
  407. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
  408. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
  409. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
  410. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
  411. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
  412. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
  413. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
  414. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
  415. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
  416. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
  417. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
  418. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
  419. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
  420. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
  421. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
  422. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
  423. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
  424. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
  425. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
  426. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
  427. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
  428. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
  429. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
  430. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
  431. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
  432. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
  433. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
  434. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
  435. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
  436. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
  437. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
  438. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
  439. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
  440. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/led.py +0 -0
  441. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
  442. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/states.py +0 -0
  443. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
  444. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
  445. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
  446. {cgse-0.16.7 → cgse-0.16.9}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
  447. {cgse-0.16.7 → cgse-0.16.9}/mkdocs.yml +0 -0
  448. {cgse-0.16.7 → cgse-0.16.9}/noxfile.py +0 -0
  449. {cgse-0.16.7 → cgse-0.16.9}/overrides/.icons/custom/dbend-dark.svg +0 -0
  450. {cgse-0.16.7 → cgse-0.16.9}/overrides/.icons/custom/dbend-light.svg +0 -0
  451. {cgse-0.16.7 → cgse-0.16.9}/overrides/.icons/custom/gear.svg +0 -0
  452. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/README.md +0 -0
  453. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/src/cgse_tools/__init__.py +0 -0
  454. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +0 -0
  455. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +0 -0
  456. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +0 -0
  457. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
  458. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/README.md +0 -0
  459. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/justfile +0 -0
  460. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/noxfile.py +0 -0
  461. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/service_registry.db +0 -0
  462. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +0 -0
  463. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +0 -0
  464. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +0 -0
  465. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_acs.py +0 -0
  466. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_adev.py +0 -0
  467. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +0 -0
  468. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_dev.py +0 -0
  469. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_mon.py +0 -0
  470. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +0 -0
  471. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_sim.py +0 -0
  472. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/__init__.py +0 -0
  473. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +0 -0
  474. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_services.py +0 -0
  475. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +0 -0
  476. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/temperature_readings.log +0 -0
  477. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/tests/script_daq6510_central_heating.py +0 -0
  478. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/tests/script_daq6510_mon.py +0 -0
  479. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/tests/script_plot_readings.py +0 -0
  480. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/tests/test_adev.py +0 -0
  481. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/keithley-tempcontrol/tests/test_dev.py +0 -0
  482. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/README.md +0 -0
  483. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.py +0 -0
  484. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.yaml +0 -0
  485. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_cs.py +0 -0
  486. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_devif.py +0 -0
  487. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_protocol.py +0 -0
  488. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/__init__.py +0 -0
  489. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +0 -0
  490. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_services.py +0 -0
  491. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/settings.yaml +0 -0
  492. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/lakeshore-tempcontrol/tests/test_lakeshore336_simulator.py +0 -0
  493. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/README.md +0 -0
  494. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
  495. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
  496. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
  497. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
  498. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod.py +0 -0
  499. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
  500. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
  501. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
  502. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
  503. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
  504. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
  505. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
  506. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
  507. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
  508. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
  509. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
  510. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
  511. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_sim.py +0 -0
  512. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
  513. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
  514. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
  515. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
  516. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
  517. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
  518. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
  519. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
  520. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/__init__.py +0 -0
  521. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +0 -0
  522. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_services.py +0 -0
  523. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/settings.yaml +0 -0
  524. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/tests/test_puna.py +0 -0
  525. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/tests/test_puna_cs.py +0 -0
  526. {cgse-0.16.7 → cgse-0.16.9}/projects/generic/symetrie-hexapod/tests/test_puna_simulator.py +0 -0
  527. {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-fits/README.md +0 -0
  528. {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
  529. {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-hdf5/README.md +0 -0
  530. {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
  531. {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-spw/README.md +0 -0
  532. {cgse-0.16.7 → cgse-0.16.9}/projects/plato/plato-spw/src/egse/spw.py +0 -0
  533. {cgse-0.16.7 → cgse-0.16.9}/ruff.toml +0 -0
  534. {cgse-0.16.7 → cgse-0.16.9}/scratch/advanced-process-monitoring.py +0 -0
  535. {cgse-0.16.7 → cgse-0.16.9}/scratch/live-process-monitoring.py +0 -0
  536. {cgse-0.16.7 → cgse-0.16.9}/scratch/match-case.py +0 -0
  537. {cgse-0.16.7 → cgse-0.16.9}/scratch/processes.json +0 -0
  538. {cgse-0.16.7 → cgse-0.16.9}/scratch/simple-process-monitoring.py +0 -0
  539. {cgse-0.16.7 → cgse-0.16.9}/temperature_readings.log +0 -0
  540. {cgse-0.16.7 → cgse-0.16.9}/test_service_registry.db +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cgse
3
- Version: 0.16.7
3
+ Version: 0.16.9
4
4
  Summary: Generic Common-EGSE: Commanding and monitoring lab equipment
5
5
  Author: IvS KU Leuven
6
6
  Maintainer-email: Rik Huygen <rik.huygen@kuleuven.be>, Sara Regibo <sara.regibo@kuleuven.be>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-common"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "Software framework to support hardware testing"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-coordinates"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "Reference Frames and Coordinate Transofrmations for CGSE"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-core"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "Core services for the CGSE framework"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -13,6 +13,7 @@ from types import MethodType
13
13
 
14
14
  import zmq
15
15
 
16
+ from egse.connect import VERBOSE_DEBUG
16
17
  from egse.decorators import dynamic_interface
17
18
  from egse.log import logger
18
19
  from egse.mixin import DynamicClientCommandMixin
@@ -102,7 +103,7 @@ class BaseProxy(ControlServerConnectionInterface):
102
103
  for a reply from the control server.
103
104
  """
104
105
 
105
- self._logger = logging.getLogger(self.__class__.__name__)
106
+ self._logger = logger
106
107
 
107
108
  self._ctx = zmq.Context.instance()
108
109
  self._poller = zmq.Poller()
@@ -123,7 +124,8 @@ class BaseProxy(ControlServerConnectionInterface):
123
124
  self.disconnect_cs()
124
125
 
125
126
  def connect_cs(self):
126
- self._logger.log(0, f"Trying to connect {self.__class__.__name__} to {self._endpoint}")
127
+ if VERBOSE_DEBUG:
128
+ self._logger.debug(f"Trying to connect {self.__class__.__name__} to {self._endpoint}")
127
129
 
128
130
  self._socket = self._ctx.socket(zmq.REQ)
129
131
  self._socket.connect(self._endpoint)
@@ -135,7 +137,8 @@ class BaseProxy(ControlServerConnectionInterface):
135
137
  self._poller.unregister(self._socket)
136
138
 
137
139
  def reconnect_cs(self):
138
- self._logger.log(20, f"Trying to reconnect {self.__class__.__name__} to {self._endpoint}")
140
+ if VERBOSE_DEBUG:
141
+ self._logger.debug(f"Trying to reconnect {self.__class__.__name__} to {self._endpoint}")
139
142
 
140
143
  if not self._socket.closed:
141
144
  self._socket.close(linger=0)
@@ -145,7 +148,8 @@ class BaseProxy(ControlServerConnectionInterface):
145
148
  self._poller.register(self._socket, zmq.POLLIN)
146
149
 
147
150
  def reset_cs_connection(self):
148
- self._logger.debug(f"Trying to reset the connection from {self.__class__.__name__} to {self._endpoint}")
151
+ if VERBOSE_DEBUG:
152
+ self._logger.debug(f"Trying to reset the connection from {self.__class__.__name__} to {self._endpoint}")
149
153
 
150
154
  self.disconnect_cs()
151
155
  self.connect_cs()
@@ -191,7 +195,9 @@ class BaseProxy(ControlServerConnectionInterface):
191
195
  if self._socket.closed:
192
196
  self.reconnect_cs()
193
197
 
194
- self._logger.log(0, f"Sending '{data}'")
198
+ if VERBOSE_DEBUG:
199
+ self._logger.debug(f"Sending '{data}'")
200
+
195
201
  self._socket.send(pickle_string)
196
202
 
197
203
  while True:
@@ -202,7 +208,8 @@ class BaseProxy(ControlServerConnectionInterface):
202
208
  if not pickle_string:
203
209
  break
204
210
  response = pickle.loads(pickle_string)
205
- self._logger.log(0, f"Receiving response: {response}")
211
+ if VERBOSE_DEBUG:
212
+ self._logger.debug(f"Receiving response: {response}")
206
213
  return response
207
214
  else:
208
215
  # timeout - server unavailable
@@ -227,7 +234,8 @@ class BaseProxy(ControlServerConnectionInterface):
227
234
 
228
235
  def ping(self):
229
236
  return_code = self.send("Ping", retries=0, timeout=1.0)
230
- self._logger.log(0, f"Check if control server is available: Ping - {return_code}")
237
+ if VERBOSE_DEBUG:
238
+ self._logger.debug(f"Check if control server is available: Ping - {return_code}")
231
239
  return return_code == "Pong"
232
240
 
233
241
  def get_endpoint(self) -> str:
@@ -329,7 +329,7 @@ class RegistryClient:
329
329
  metadata=self._service_info["metadata"],
330
330
  )
331
331
 
332
- def discover_service(self, service_type: str, use_cache: bool = False) -> dict[str, Any] | None:
332
+ def discover_service(self, service_type: str) -> dict[str, Any] | None:
333
333
  """
334
334
  Discover a service of the specified type. The service is guaranteed to be healthy at the time of discovery.
335
335
 
@@ -341,15 +341,10 @@ class RegistryClient:
341
341
 
342
342
  Args:
343
343
  service_type: Type of service to discover
344
- use_cache: Whether to use cached service information
345
344
 
346
345
  Returns:
347
346
  Service information if found, None otherwise
348
347
  """
349
- # Try to use cache first if enabled
350
- if use_cache:
351
- self.logger.info("Cache not yet implemented.")
352
-
353
348
  request = {"action": "discover", "service_type": service_type}
354
349
 
355
350
  response = self._send_request(MessageType.REQUEST_WITH_REPLY, request)
@@ -363,14 +358,13 @@ class RegistryClient:
363
358
  self.logger.warning(f"Service discovery failed: {response.get('error')}")
364
359
  return None
365
360
 
366
- def get_service(self, service_id: str | None = None, use_cache: bool = True) -> dict[str, Any] | None:
361
+ def get_service(self, service_id: str | None = None) -> dict[str, Any] | None:
367
362
  """
368
363
  Get information about a specific service. When no service_id is given,
369
364
  the service_id known to this client will be used.
370
365
 
371
366
  Args:
372
367
  service_id: ID of the service to get [default=None]
373
- use_cache: Whether to use cached service information
374
368
 
375
369
  Returns:
376
370
  Service information if found, None otherwise.
@@ -461,6 +455,9 @@ class RegistryClient:
461
455
  self.logger.warning("Cannot start heartbeat: no service is registered")
462
456
  return None
463
457
 
458
+ # Cancel an existing heartbeat thread if present
459
+ self.stop_heartbeat()
460
+
464
461
  # If interval not specified, use 1/3 of TTL
465
462
  if interval is None:
466
463
  interval = max(1, self._ttl // 3)
@@ -479,7 +476,7 @@ class RegistryClient:
479
476
  self.logger.warning("ServiceRegistry not responding.")
480
477
  return
481
478
  else:
482
- self.logger.info("Health check succeeded, reregistering ?")
479
+ self.logger.info("Health check succeeded, reregistering...")
483
480
  self.reregister()
484
481
 
485
482
  else:
@@ -579,10 +576,6 @@ class AsyncRegistryClient:
579
576
 
580
577
  self._event_handlers = {}
581
578
 
582
- # Service cache (for discovery)
583
- self._service_cache = {}
584
- self._service_cache_lock = None
585
-
586
579
  self.req_socket: zmq.asyncio.Socket | None = None
587
580
  self.sub_socket: zmq.asyncio.Socket | None = None
588
581
  self.hb_socket: zmq.asyncio.Socket | None = None
@@ -609,8 +602,6 @@ class AsyncRegistryClient:
609
602
  # Default to receiving all events
610
603
  self.sub_socket.setsockopt_string(zmq.SUBSCRIBE, "")
611
604
 
612
- self._connect_hb_socket()
613
-
614
605
  def _connect_hb_socket(self):
615
606
  self.hb_socket = self.context.socket(zmq.REQ)
616
607
  self.hb_socket.setsockopt(zmq.LINGER, 0) # Don't wait for unsent messages on close()
@@ -627,18 +618,12 @@ class AsyncRegistryClient:
627
618
  self.sub_socket.close(linger=0)
628
619
  self.sub_socket = None
629
620
 
630
- self._disconnect_hb_socket()
631
-
632
621
  def _disconnect_hb_socket(self):
633
622
  if self.hb_socket:
634
- self.hb_socket.close(linger=0)
623
+ self.hb_socket.setsockopt(zmq.LINGER, 0)
624
+ self.hb_socket.close()
635
625
  self.hb_socket = None
636
626
 
637
- def _get_service_cache_lock(self):
638
- if self._service_cache_lock is None:
639
- self._service_cache_lock = asyncio.Lock()
640
- return self._service_cache_lock
641
-
642
627
  async def _send_request(
643
628
  self, msg_type: MessageType, request: dict[str, Any], timeout: float = None
644
629
  ) -> dict[str, Any]:
@@ -653,10 +638,10 @@ class AsyncRegistryClient:
653
638
  Returns:
654
639
  The response from the registry as a dictionary.
655
640
  """
656
- self.logger.debug(f"Sending request: {request}")
657
641
 
658
642
  timeout = timeout or self.timeout
659
643
  try:
644
+ self.logger.debug(f"Sending request: {request}")
660
645
  await self.req_socket.send_multipart([msg_type.value, json.dumps(request).encode()])
661
646
 
662
647
  try:
@@ -714,9 +699,9 @@ class AsyncRegistryClient:
714
699
  except asyncio.TimeoutError:
715
700
  self.logger.error(f"Heartbeat request timed out after {HEART_BEAT_TIMEOUT:.2f}s")
716
701
  # Reset the socket to avoid invalid state
717
- self.hb_socket.close()
718
- self.hb_socket = self.context.socket(zmq.REQ)
719
- self.hb_socket.connect(self.registry_req_endpoint)
702
+ self._disconnect_hb_socket()
703
+ await asyncio.sleep(HEART_BEAT_RECONNECT)
704
+ self._connect_hb_socket()
720
705
  return {"success": False, "error": "Heartbeat request timed out"}
721
706
  except zmq.ZMQError as exc:
722
707
  self.logger.error(f"ZMQ error: {exc}", exc_info=True)
@@ -816,6 +801,25 @@ class AsyncRegistryClient:
816
801
  self.logger.error(f"Failed to deregister service: {response.get('error')}")
817
802
  return False
818
803
 
804
+ async def reregister(self) -> str | None:
805
+ if not self._service_id:
806
+ self.logger.warning("Cannot reregister: no service is registered")
807
+ return None
808
+
809
+ if not self._service_info:
810
+ self.logger.warning(
811
+ "Cannot reregister: no service info was saved by this registry client or service already deregistered."
812
+ )
813
+ return None
814
+
815
+ return await self.register(
816
+ name=self._service_info["name"],
817
+ host=self._service_info["host"],
818
+ port=self._service_info["port"],
819
+ service_type=self._service_info["type"],
820
+ metadata=self._service_info["metadata"],
821
+ )
822
+
819
823
  async def start_heartbeat(self, interval: int | None = None) -> asyncio.Task | None:
820
824
  """
821
825
  Start sending heartbeats to the registry.
@@ -840,6 +844,8 @@ class AsyncRegistryClient:
840
844
  self._running = True
841
845
 
842
846
  async def heartbeat_loop():
847
+ self._connect_hb_socket()
848
+
843
849
  try:
844
850
  while self._running and self._service_id:
845
851
  try:
@@ -849,8 +855,17 @@ class AsyncRegistryClient:
849
855
 
850
856
  if not response.get("success"):
851
857
  self.logger.warning(f"Heartbeat failed: {response.get('error')}")
858
+
859
+ # Do a health check
860
+ if not await self.health_check():
861
+ self.logger.warning("ServiceRegistry not responding.")
862
+ continue
863
+ else:
864
+ self.logger.info("Health check succeeded, reregistering...")
865
+ await self.reregister()
866
+
852
867
  else:
853
- self.logger.info(response.get("message"))
868
+ self.logger.debug(response.get("message"))
854
869
  except Exception as exc:
855
870
  self.logger.error(f"Error in heartbeat loop: {exc}", exc_info=True)
856
871
 
@@ -858,6 +873,8 @@ class AsyncRegistryClient:
858
873
  await asyncio.sleep(interval)
859
874
  except asyncio.CancelledError:
860
875
  self.logger.info("Heartbeat task cancelled")
876
+ finally:
877
+ self._disconnect_hb_socket()
861
878
 
862
879
  # Start the heartbeat task
863
880
  self._heartbeat_task = task = asyncio.create_task(heartbeat_loop())
@@ -960,9 +977,6 @@ class AsyncRegistryClient:
960
977
 
961
978
  self.logger.debug(f"Received event: {event_type}")
962
979
 
963
- # Update service cache based on events
964
- await self._update_cache_from_event(event_type, event)
965
-
966
980
  # Call registered handlers
967
981
  handlers = self._event_handlers.get(event_type, [])
968
982
  for handler in handlers:
@@ -990,30 +1004,7 @@ class AsyncRegistryClient:
990
1004
  self.logger.info("Started event listener task")
991
1005
  return task
992
1006
 
993
- async def _update_cache_from_event(self, event_type: str, event: dict[str, Any]) -> None:
994
- """
995
- Update the service cache based on registry events.
996
-
997
- Args:
998
- event_type: Type of the event.
999
- event: Event data
1000
- """
1001
- async with self._get_service_cache_lock():
1002
- data = event.get("data", {})
1003
- service_id = data.get("service_id")
1004
-
1005
- if not service_id:
1006
- return
1007
-
1008
- if event_type == "register":
1009
- service_info = data.get("service_info", {})
1010
- if service_info:
1011
- self._service_cache[service_id] = service_info
1012
- elif event_type in ("deregister", "expire"):
1013
- if service_id in self._service_cache:
1014
- del self._service_cache[service_id]
1015
-
1016
- async def discover_service(self, service_type: str, use_cache: bool = True) -> dict[str, Any] | None:
1007
+ async def discover_service(self, service_type: str) -> dict[str, Any] | None:
1017
1008
  """
1018
1009
  Discover a service of the specified type. The service is guaranteed to be healthy at the time of discovery.
1019
1010
 
@@ -1025,27 +1016,11 @@ class AsyncRegistryClient:
1025
1016
 
1026
1017
  Args:
1027
1018
  service_type: Type of service to discover
1028
- use_cache: Whether to use cached service information
1029
1019
 
1030
1020
  Returns:
1031
1021
  Service information if found, None otherwise
1032
1022
  """
1033
- # Try to use cache first if enabled
1034
- if use_cache:
1035
- async with self._get_service_cache_lock():
1036
- # Find services of the specified type
1037
- matching_services = []
1038
- for service_id, service_info in self._service_cache.items():
1039
- if service_info.get("type") == service_type or service_type in service_info.get("tags", []):
1040
- matching_services.append(service_info)
1041
-
1042
- if matching_services:
1043
- # Simple load balancing - random selection
1044
- import random
1045
-
1046
- return random.choice(matching_services)
1047
-
1048
- # If not found in cache or cache disabled, ask the registry
1023
+
1049
1024
  request = {"action": "discover", "service_type": service_type}
1050
1025
 
1051
1026
  response = await self._send_request(MessageType.REQUEST_WITH_REPLY, request)
@@ -1055,34 +1030,25 @@ class AsyncRegistryClient:
1055
1030
  if response.get("success"):
1056
1031
  service = response.get("service")
1057
1032
 
1058
- # Update cache
1059
- if service and "id" in service:
1060
- async with self._get_service_cache_lock():
1061
- self._service_cache[service["id"]] = service
1062
-
1063
1033
  return service
1064
1034
  else:
1065
1035
  self.logger.warning(f"Service discovery failed: {response.get('error')}")
1066
1036
  return None
1067
1037
 
1068
- async def get_service(self, service_id: str, use_cache: bool = True) -> dict[str, Any] | None:
1038
+ async def get_service(self, service_id: str | None = None) -> dict[str, Any] | None:
1069
1039
  """
1070
- Get information about a specific service.
1040
+ Get information about a specific service. When no service_id is given,
1041
+ the service_id known to this client will be used.
1071
1042
 
1072
1043
  Args:
1073
1044
  service_id: ID of the service to get
1074
- use_cache: Whether to use cached service information
1075
1045
 
1076
1046
  Returns:
1077
1047
  Service information if found, None otherwise
1078
1048
  """
1079
- # Try to use cache first if enabled
1080
- if use_cache:
1081
- async with self._get_service_cache_lock():
1082
- if service_id in self._service_cache:
1083
- return self._service_cache[service_id]
1084
1049
 
1085
- # If not found in cache or cache disabled, ask the registry
1050
+ service_id = service_id or self._service_id
1051
+
1086
1052
  request = {"action": "get", "service_id": service_id}
1087
1053
 
1088
1054
  response = await self._send_request(MessageType.REQUEST_WITH_REPLY, request)
@@ -1090,11 +1056,6 @@ class AsyncRegistryClient:
1090
1056
  if response.get("success"):
1091
1057
  service = response.get("service")
1092
1058
 
1093
- # Update cache
1094
- if service:
1095
- async with self._get_service_cache_lock():
1096
- self._service_cache[service_id] = service
1097
-
1098
1059
  return service
1099
1060
  else:
1100
1061
  self.logger.warning(f"Get service failed: {response.get('error')}")
@@ -1117,12 +1078,6 @@ class AsyncRegistryClient:
1117
1078
  if response.get("success"):
1118
1079
  services = response.get("services", [])
1119
1080
 
1120
- # Update cache
1121
- async with self._get_service_cache_lock():
1122
- for service in services:
1123
- if "id" in service:
1124
- self._service_cache[service["id"]] = service
1125
-
1126
1081
  return services
1127
1082
  else:
1128
1083
  self.logger.warning(f"List services failed: {response.get('error')}")
@@ -1192,35 +1147,6 @@ class AsyncRegistryClient:
1192
1147
  except Exception as exc:
1193
1148
  self.logger.error(f"Error during cleanup: {exc}")
1194
1149
 
1195
- @asynccontextmanager
1196
- async def register_context(self, *args, **kwargs):
1197
- """
1198
- Async context manager for service registration.
1199
-
1200
- Example:
1201
- async with client.register_context("my-service", "localhost", 8080):
1202
- # Service is registered
1203
- await app.start()
1204
- # Service is automatically deregistered
1205
- """
1206
- service_id = await self.register(*args, **kwargs)
1207
-
1208
- if not service_id:
1209
- raise RuntimeError("Failed to register service")
1210
-
1211
- # Start heartbeat and event listener
1212
- await self.start_heartbeat()
1213
- await self.start_event_listener()
1214
-
1215
- try:
1216
- yield service_id
1217
- finally:
1218
- # Clean up
1219
- await self.stop_event_listener()
1220
- await self.stop_heartbeat()
1221
- await self.deregister()
1222
- # await self.close() # client shall not be closed by this context manager !!
1223
-
1224
1150
 
1225
1151
  def is_service_registered(service_type: str):
1226
1152
  """Convenience function to check if a service is registered."""
@@ -490,6 +490,7 @@ class AsyncRegistryServer:
490
490
  "status": "ok",
491
491
  "req_port": self.req_port,
492
492
  "pub_port": self.pub_port,
493
+ "hb_port": self.hb_port,
493
494
  "services": services,
494
495
  }
495
496
 
@@ -577,6 +578,7 @@ async def status(
577
578
  Status: {response["status"]}
578
579
  Requests port: {response["req_port"]}
579
580
  Notifications port: {response["pub_port"]}
581
+ Heartbeat port: {response["hb_port"]}
580
582
  Registrations: {", ".join([f"({x['name']}, {x['health']})" for x in response["services"]])}\
581
583
  """
582
584
  )
@@ -62,6 +62,8 @@ class StorageControlServer(ControlServer):
62
62
 
63
63
  multiprocessing.current_process().name = PROCESS_NAME
64
64
 
65
+ self.scheduler: BackgroundScheduler | None = None
66
+
65
67
  self.logger = logger
66
68
  self.service_name = PROCESS_NAME
67
69
  self.service_type = SERVICE_TYPE
@@ -76,13 +78,6 @@ class StorageControlServer(ControlServer):
76
78
 
77
79
  self.register_service(service_type=SERVICE_TYPE)
78
80
 
79
- # NOTE:
80
- # Since the CM CS is started after the SM CS in the normal startup sequence, delay the task to load
81
- # the Setup until after the CM CS has been properly started. We do that now with a delay time of 30s,
82
- # but we might in the future use a function returning a boolean, until...
83
- # from egse.confman import is_configuration_manager_active
84
- # self.schedule_task(self.device_protocol.controller.load_setup, after=10.0, when=is_configuration_manager_active)
85
-
86
81
  def before_serve(self):
87
82
  self.scheduler = BackgroundScheduler(timezone=utc)
88
83
  self.scheduler.start()
@@ -787,70 +787,3 @@ async def test_client_health_check(client, server):
787
787
  """Test health check."""
788
788
  health = await client.health_check()
789
789
  assert health is True
790
-
791
-
792
- @pytest.mark.asyncio
793
- async def test_client_caching(client, server):
794
- """Test client's service caching."""
795
-
796
- service_id = await client.register("cache-test-service", "localhost", 8080, service_type="cache-test")
797
-
798
- # Look up the service (should populate cache)
799
- service = await client.get_service(service_id)
800
- assert service is not None
801
-
802
- # Check if it's in the cache
803
- async with client._service_cache_lock:
804
- assert service_id in client._service_cache
805
-
806
- # Look up by type (should use cache when use_cache=True)
807
- with patch.object(client, "_send_request", new_callable=AsyncMock) as mock_send:
808
- # First call with use_cache=True should check cache
809
- service = await client.discover_service("cache-test", use_cache=True)
810
- assert service is not None
811
- assert service["id"] == service_id
812
-
813
- # Configure the mock to return a dictionary that matches what _send_request would return
814
- mock_send.return_value = {
815
- "success": True,
816
- "service": {
817
- "id": service_id,
818
- "name": "cache-test-service",
819
- "host": "localhost",
820
- "port": 8080,
821
- "type": "cache-test",
822
- },
823
- }
824
-
825
- # Second call with use_cache=False should make a request
826
- service = await client.discover_service("cache-test", use_cache=False)
827
- assert service is not None
828
- assert mock_send.called
829
-
830
-
831
- @pytest.mark.asyncio
832
- async def test_client_register_context(client, server, req_socket):
833
- """Test the register_context context manager."""
834
-
835
- # Use the context manager
836
- async with client.register_context(
837
- "context-test-service", "localhost", 8080, service_type="context-test"
838
- ) as service_id:
839
- # Verify the service was registered
840
- response = await send_request(
841
- MessageType.REQUEST_WITH_REPLY, req_socket, {"action": "get", "service_id": service_id}
842
- )
843
-
844
- logger.info(f"----- In test_client_register_context: {response}")
845
-
846
- assert response["success"] is True
847
- assert response["service"]["name"] == "context-test-service"
848
-
849
- logger.info("----- In test_client_register_context: after context...")
850
-
851
- # After exiting the context, the service should be deregistered
852
- response = await send_request(
853
- MessageType.REQUEST_WITH_REPLY, req_socket, {"action": "get", "service_id": service_id}
854
- )
855
-
856
- assert response["success"] is False
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-gui"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "GUI components for CGSE"
5
5
  authors = [
6
6
  {name = "Rik Huygen", email = "rik.huygen@kuleuven.be"},
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-tools"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "Tools for CGSE"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "keithley-tempcontrol"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "Keithley Temperature Control for CGSE"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "lakeshore-tempcontrol"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "Lakeshore Temperature Control for CGSE"
5
5
  authors = [
6
6
  {name = "IVS KU Leuven"}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "symetrie-hexapod"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "Symetrie Hexapod implementation for CGSE"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plato-fits"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "FITS Persistence implementation for CGSE"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plato-hdf5"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "HDF5 Persistence sub-class for CGSE"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plato-spw"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "SpaceWire implementation for CGSE"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse"
3
- version = "0.16.7"
3
+ version = "0.16.9"
4
4
  description = "Generic Common-EGSE: Commanding and monitoring lab equipment"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
index e914731..6227ca3 100644
Binary file
Binary file
Binary file
File without changes