cgse 2025.0.6__tar.gz → 2025.0.8__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 (346) hide show
  1. {cgse-2025.0.6 → cgse-2025.0.8}/PKG-INFO +1 -1
  2. {cgse-2025.0.6 → cgse-2025.0.8}/docs/getting_started.md +25 -0
  3. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/pyproject.toml +2 -2
  4. cgse-2025.0.8/libs/cgse-common/src/egse/control.py +448 -0
  5. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/device.py +4 -3
  6. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/mixin.py +7 -0
  7. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/protocol.py +3 -3
  8. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/services.py +2 -2
  9. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/setup.py +2 -1
  10. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/pyproject.toml +1 -1
  11. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/pyproject.toml +3 -2
  12. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/confman/confman_cs.py +1 -1
  13. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/procman/__init__.py +1 -1
  14. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/storage/storage_cs.py +1 -4
  15. cgse-2025.0.8/libs/cgse-core/src/scripts/_start.py +41 -0
  16. cgse-2025.0.8/libs/cgse-core/src/scripts/_status.py +81 -0
  17. cgse-2025.0.8/libs/cgse-core/src/scripts/_stop.py +41 -0
  18. cgse-2025.0.8/libs/cgse-core/src/scripts/cgse.py +98 -0
  19. cgse-2025.0.8/libs/cgse-core/src/scripts/services.py +49 -0
  20. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/pyproject.toml +1 -1
  21. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/cgse-tools/pyproject.toml +10 -8
  22. cgse-2025.0.8/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +47 -0
  23. cgse-2025.0.8/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +201 -0
  24. cgse-2025.0.8/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +28 -0
  25. cgse-2025.0.8/projects/generic/keithley-tempcontrol/README.md +9 -0
  26. cgse-2025.0.8/projects/generic/keithley-tempcontrol/pyproject.toml +64 -0
  27. cgse-2025.0.8/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +4 -0
  28. cgse-2025.0.8/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +723 -0
  29. cgse-2025.0.8/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +102 -0
  30. cgse-2025.0.8/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +197 -0
  31. cgse-2025.0.8/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_devif.py +359 -0
  32. cgse-2025.0.8/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +105 -0
  33. cgse-2025.0.8/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +22 -0
  34. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/pyproject.toml +1 -1
  35. {cgse-2025.0.6 → cgse-2025.0.8}/projects/plato/plato-fits/pyproject.toml +1 -1
  36. cgse-2025.0.8/projects/plato/plato-hdf5/README.md +0 -0
  37. {cgse-2025.0.6 → cgse-2025.0.8}/projects/plato/plato-hdf5/pyproject.toml +1 -1
  38. cgse-2025.0.8/projects/plato/plato-spw/README.md +0 -0
  39. {cgse-2025.0.6 → cgse-2025.0.8}/projects/plato/plato-spw/pyproject.toml +1 -1
  40. {cgse-2025.0.6 → cgse-2025.0.8}/pyproject.toml +1 -1
  41. cgse-2025.0.6/libs/cgse-common/src/egse/control.py +0 -348
  42. cgse-2025.0.6/libs/cgse-core/src/scripts/cgse.py +0 -179
  43. cgse-2025.0.6/projects/generic/cgse-tools/src/scripts/cgse_plugins.py +0 -9
  44. cgse-2025.0.6/projects/generic/cgse-tools/src/scripts/cgse_service_plugins.py +0 -10
  45. {cgse-2025.0.6 → cgse-2025.0.8}/.gitignore +0 -0
  46. {cgse-2025.0.6 → cgse-2025.0.8}/NOTES.md +0 -0
  47. {cgse-2025.0.6 → cgse-2025.0.8}/README.md +0 -0
  48. {cgse-2025.0.6 → cgse-2025.0.8}/TODO.md +0 -0
  49. {cgse-2025.0.6 → cgse-2025.0.8}/bump.py +0 -0
  50. {cgse-2025.0.6 → cgse-2025.0.8}/conftest.py +0 -0
  51. {cgse-2025.0.6 → cgse-2025.0.8}/docs/custom_theme/main.html +0 -0
  52. {cgse-2025.0.6 → cgse-2025.0.8}/docs/dev_guide/coding_style.md +0 -0
  53. {cgse-2025.0.6 → cgse-2025.0.8}/docs/dev_guide/docs.md +0 -0
  54. {cgse-2025.0.6 → cgse-2025.0.8}/docs/dev_guide/index.md +0 -0
  55. {cgse-2025.0.6 → cgse-2025.0.8}/docs/dev_guide/installation.md +0 -0
  56. {cgse-2025.0.6 → cgse-2025.0.8}/docs/dev_guide/uv.md +0 -0
  57. {cgse-2025.0.6 → cgse-2025.0.8}/docs/help.md +0 -0
  58. {cgse-2025.0.6 → cgse-2025.0.8}/docs/images/icons/cgse-logo-blue.svg +0 -0
  59. {cgse-2025.0.6 → cgse-2025.0.8}/docs/images/icons/cgse-logo.svg +0 -0
  60. {cgse-2025.0.6 → cgse-2025.0.8}/docs/index.md +0 -0
  61. {cgse-2025.0.6 → cgse-2025.0.8}/docs/libs/cgse-common/images/load_methods.png +0 -0
  62. {cgse-2025.0.6 → cgse-2025.0.8}/docs/libs/cgse-common/index.md +0 -0
  63. {cgse-2025.0.6 → cgse-2025.0.8}/docs/libs/cgse-common/settings.md +0 -0
  64. {cgse-2025.0.6 → cgse-2025.0.8}/docs/libs/cgse-common/setup.md +0 -0
  65. {cgse-2025.0.6 → cgse-2025.0.8}/docs/libs/cgse-coordinates/index.md +0 -0
  66. {cgse-2025.0.6 → cgse-2025.0.8}/docs/libs/cgse-core/index.md +0 -0
  67. {cgse-2025.0.6 → cgse-2025.0.8}/docs/libs/cgse-gui/index.md +0 -0
  68. {cgse-2025.0.6 → cgse-2025.0.8}/docs/libs/index.md +0 -0
  69. {cgse-2025.0.6 → cgse-2025.0.8}/docs/package_list.md +0 -0
  70. {cgse-2025.0.6 → cgse-2025.0.8}/docs/projects/cgse-tools.md +0 -0
  71. {cgse-2025.0.6 → cgse-2025.0.8}/docs/projects/index.md +0 -0
  72. {cgse-2025.0.6 → cgse-2025.0.8}/docs/projects/symetrie-hexapod.md +0 -0
  73. {cgse-2025.0.6 → cgse-2025.0.8}/docs/stylesheets/custom.css +0 -0
  74. {cgse-2025.0.6 → cgse-2025.0.8}/docs/tutorial.md +0 -0
  75. {cgse-2025.0.6 → cgse-2025.0.8}/docs/user_guide/index.md +0 -0
  76. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/README.md +0 -0
  77. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/cgse_common/__init__.py +0 -0
  78. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
  79. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/bits.py +0 -0
  80. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/calibration.py +0 -0
  81. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/command.py +0 -0
  82. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/config.py +0 -0
  83. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/decorators.py +0 -0
  84. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/env.py +0 -0
  85. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/exceptions.py +0 -0
  86. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/hk.py +0 -0
  87. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/metrics.py +0 -0
  88. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/monitoring.py +0 -0
  89. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/observer.py +0 -0
  90. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/obsid.py +0 -0
  91. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/persistence.py +0 -0
  92. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/plugin.py +0 -0
  93. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/process.py +0 -0
  94. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/proxy.py +0 -0
  95. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/reload.py +0 -0
  96. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/resource.py +0 -0
  97. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/response.py +0 -0
  98. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/services.yaml +0 -0
  99. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/settings.py +0 -0
  100. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/settings.yaml +0 -0
  101. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/state.py +0 -0
  102. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/system.py +0 -0
  103. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/version.py +0 -0
  104. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/src/egse/zmq_ser.py +0 -0
  105. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/conftest.py +0 -0
  106. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
  107. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
  108. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
  109. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
  110. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
  111. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
  112. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
  113. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
  114. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/IAS/README.md +0 -0
  115. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/INTA/README.md +0 -0
  116. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
  117. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
  118. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
  119. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
  120. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
  121. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
  122. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
  123. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
  124. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
  125. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
  126. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
  127. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
  128. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/data/command.yaml +0 -0
  129. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
  130. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
  131. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
  132. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
  133. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
  134. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
  135. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
  136. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
  137. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
  138. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/dummy.py +0 -0
  139. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
  140. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
  141. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_bits.py +0 -0
  142. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_command.py +0 -0
  143. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_config.py +0 -0
  144. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_control.py +0 -0
  145. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_decorators.py +0 -0
  146. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_device.py +0 -0
  147. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_env.py +0 -0
  148. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_fixtures.py +0 -0
  149. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_hk.py +0 -0
  150. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_resource.py +0 -0
  151. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_response.py +0 -0
  152. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_settings.py +0 -0
  153. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_setup.py +0 -0
  154. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-common/tests/test_system.py +0 -0
  155. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/README.md +0 -0
  156. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +0 -0
  157. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +0 -0
  158. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +0 -0
  159. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +0 -0
  160. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/src/egse/coordinates/point.py +0 -0
  161. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +0 -0
  162. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +0 -0
  163. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +0 -0
  164. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +0 -0
  165. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +0 -0
  166. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/.envrc.disabled +0 -0
  167. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/README.md +0 -0
  168. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
  169. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/cgse_core/settings.yaml +0 -0
  170. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/confman/__init__.py +0 -0
  171. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
  172. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
  173. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/logger/__init__.py +0 -0
  174. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/logger/__main__.py +0 -0
  175. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/logger/log_cs.py +0 -0
  176. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
  177. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/procman/procman_cs.py +0 -0
  178. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/storage/__init__.py +0 -0
  179. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
  180. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/storage/persistence.py +0 -0
  181. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
  182. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/tests/conftest.py +0 -0
  183. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
  184. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/tests/fixtures/default_env.py +0 -0
  185. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/tests/fixtures/helpers.py +0 -0
  186. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/tests/fixtures/services.py +0 -0
  187. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/tests/test_confman_setups.py +0 -0
  188. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/tests/test_logger.py +0 -0
  189. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-core/tests/test_settings_core.py +0 -0
  190. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/README.md +0 -0
  191. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/__init__.py +0 -0
  192. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/buttons.py +0 -0
  193. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
  194. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
  195. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
  196. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
  197. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
  198. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
  199. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
  200. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
  201. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
  202. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
  203. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
  204. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
  205. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
  206. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
  207. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
  208. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
  209. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
  210. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
  211. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
  212. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
  213. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
  214. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
  215. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
  216. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
  217. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
  218. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
  219. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
  220. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
  221. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
  222. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
  223. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
  224. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
  225. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
  226. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
  227. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
  228. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
  229. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
  230. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
  231. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
  232. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
  233. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
  234. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
  235. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
  236. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
  237. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
  238. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
  239. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
  240. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
  241. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
  242. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
  243. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
  244. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
  245. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
  246. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
  247. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
  248. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
  249. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
  250. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
  251. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
  252. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
  253. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
  254. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
  255. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
  256. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
  257. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
  258. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
  259. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
  260. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
  261. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
  262. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
  263. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
  264. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
  265. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
  266. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
  267. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
  268. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
  269. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
  270. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
  271. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
  272. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
  273. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
  274. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
  275. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
  276. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
  277. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
  278. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
  279. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
  280. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
  281. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
  282. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
  283. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
  284. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
  285. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
  286. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
  287. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
  288. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
  289. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
  290. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
  291. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
  292. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
  293. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
  294. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
  295. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
  296. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
  297. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
  298. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
  299. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
  300. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
  301. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
  302. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
  303. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
  304. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/led.py +0 -0
  305. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/limitswitch.py +0 -0
  306. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/states.py +0 -0
  307. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
  308. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
  309. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
  310. {cgse-2025.0.6 → cgse-2025.0.8}/libs/cgse-gui/src/egse/gui/switch.py +0 -0
  311. {cgse-2025.0.6 → cgse-2025.0.8}/mkdocs.yml +0 -0
  312. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/cgse-tools/README.md +0 -0
  313. /cgse-2025.0.6/projects/plato/plato-hdf5/README.md → /cgse-2025.0.8/projects/generic/cgse-tools/src/cgse_tools/__init__.py +0 -0
  314. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/cgse-tools/src/egse/tools/status.py +0 -0
  315. /cgse-2025.0.6/projects/plato/plato-spw/README.md → /cgse-2025.0.8/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/__init__.py +0 -0
  316. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/README.md +0 -0
  317. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +0 -0
  318. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +0 -0
  319. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +0 -0
  320. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +0 -0
  321. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +0 -0
  322. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +0 -0
  323. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
  324. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +0 -0
  325. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +0 -0
  326. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +0 -0
  327. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +0 -0
  328. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +0 -0
  329. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +0 -0
  330. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
  331. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +0 -0
  332. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +0 -0
  333. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +0 -0
  334. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +0 -0
  335. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +0 -0
  336. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
  337. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +0 -0
  338. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +0 -0
  339. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +0 -0
  340. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +0 -0
  341. {cgse-2025.0.6 → cgse-2025.0.8}/projects/generic/symetrie-hexapod/src/scripts/cgse_service_plugins.py +0 -0
  342. {cgse-2025.0.6 → cgse-2025.0.8}/projects/plato/plato-fits/README.md +0 -0
  343. {cgse-2025.0.6 → cgse-2025.0.8}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +0 -0
  344. {cgse-2025.0.6 → cgse-2025.0.8}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +0 -0
  345. {cgse-2025.0.6 → cgse-2025.0.8}/projects/plato/plato-spw/src/egse/spw.py +0 -0
  346. {cgse-2025.0.6 → cgse-2025.0.8}/ruff.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cgse
3
- Version: 2025.0.6
3
+ Version: 2025.0.8
4
4
  Summary: Generic Common-EGSE: Commanding and monitoring lab equipment
5
5
  Author-email: Rik Huygen <rik.huygen@kuleuven.be>, Sara Regibo <sara.regibo@kuleuven.be>
6
6
  License: MIT
@@ -89,3 +89,28 @@ use the '--full' flag to get a more detailed report, '--doc' for help on the var
89
89
 
90
90
  The folders that do not exist (and are not None) can be created by adding the option `--mkdir` to the above
91
91
  command.
92
+
93
+ ## Check your Settings
94
+
95
+ Settings contains the static configuration of your system, test setup, equipment, including the System Under Test
96
+ (SUT). You can test your settings with the command below. Let's first also set the `ARIEL_LOCALSETTINGS` environment
97
+ variables:
98
+
99
+ ```
100
+ $ export ARIEL_LOCAL_SETTINGS=~/cgse/local_settings_ariel_vacuum_lab.yaml
101
+ $ py -m egse.settings
102
+ Settings
103
+ ├── PACKAGES
104
+ │ └── CGSE_COMMON: Common classes, functions, decorators, etc. for the CGSE
105
+ ├── SITE
106
+ │ ├── ID: VACUUM_LAB
107
+ │ ├── SSH_SERVER: localhost
108
+ │ └── SSH_PORT: 22
109
+ └── PROCESS
110
+ └── METRICS_INTERVAL: 10
111
+ Memoized locations:
112
+ ['/Users/rik/tmp/gettings-started/venv/lib/python3.9/site-packages/cgse_common/settings.yaml',
113
+ '/Users/rik/cgse/local_settings_ariel_vacuum_lab.yaml']
114
+ ```
115
+ These Settings will grow when you add more packages to your installation or when you define settings yourself in the
116
+ local settings file.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-common"
3
- version = "2025.0.6"
3
+ version = "2025.0.8"
4
4
  description = "Software framework to support hardware testing"
5
5
  authors = [
6
6
  {name = "IVS KU Leuven"}
@@ -63,7 +63,7 @@ exclude = [
63
63
  ]
64
64
 
65
65
  [tool.hatch.build.targets.wheel]
66
- packages = ["src/egse", "src/cgse-common"]
66
+ packages = ["src/egse", "src/cgse_common"]
67
67
 
68
68
  [tool.ruff]
69
69
  line-length = 120
@@ -0,0 +1,448 @@
1
+ """
2
+ This module defines the abstract class for any Control Server and some convenience functions.
3
+ """
4
+
5
+ import abc
6
+ import logging
7
+ import pickle
8
+ import threading
9
+ from typing import Union
10
+
11
+ import zmq
12
+
13
+ from egse.system import time_in_ms
14
+
15
+ try:
16
+ from egse.logger import close_all_zmq_handlers
17
+ except ImportError:
18
+ def close_all_zmq_handlers(): # noqa
19
+ pass
20
+
21
+ from egse.process import ProcessStatus
22
+ from egse.settings import Settings
23
+ from egse.system import do_every
24
+ from egse.system import get_average_execution_time
25
+ from egse.system import get_average_execution_times
26
+ from egse.system import get_full_classname
27
+ from egse.system import get_host_ip
28
+ from egse.system import save_average_execution_time
29
+
30
+ MODULE_LOGGER = logging.getLogger(__name__)
31
+ PROCESS_SETTINGS = Settings.load("PROCESS")
32
+
33
+
34
+ def is_control_server_active(endpoint: str = None, timeout: float = 0.5) -> bool:
35
+ """ Checks if the Control Server is running.
36
+
37
+ This function sends a *Ping* message to the Control Server and expects a *Pong* answer back within the timeout
38
+ period.
39
+
40
+ Args:
41
+ endpoint (str): Endpoint to connect to, i.e. <protocol>://<address>:<port>
42
+ timeout (float): Timeout when waiting for a reply [s, default=0.5]
43
+
44
+ Returns: True if the Control Server is running and replied with the expected answer; False otherwise.
45
+ """
46
+
47
+ ctx = zmq.Context.instance()
48
+
49
+ return_code = False
50
+
51
+ try:
52
+ socket = ctx.socket(zmq.REQ)
53
+ socket.connect(endpoint)
54
+ data = pickle.dumps("Ping")
55
+ socket.send(data)
56
+ rlist, _, _ = zmq.select([socket], [], [], timeout=timeout)
57
+
58
+ if socket in rlist:
59
+ data = socket.recv()
60
+ response = pickle.loads(data)
61
+ return_code = response == "Pong"
62
+ socket.close(linger=0)
63
+ except Exception as exc:
64
+ MODULE_LOGGER.warning(f"Caught an exception while pinging a control server at {endpoint}: {exc}.")
65
+
66
+ return return_code
67
+
68
+
69
+ class ControlServer(metaclass=abc.ABCMeta):
70
+ """ Base class for all device control servers and for the Storage Manager and Configuration Manager.
71
+
72
+ A Control Server reads commands from a ZeroMQ socket and executes these commands by calling the `execute()` method
73
+ of the commanding protocol class.
74
+
75
+ The sub-class shall define the following:
76
+
77
+ - Define the device protocol class -> `self.device_protocol`
78
+ - Bind the command socket to the device protocol -> `self.dev_ctrl_cmd_sock`
79
+ - Register the command socket in the poll set -> `self.poller`
80
+
81
+ """
82
+
83
+ def __init__(self):
84
+ """ Initialisation of a new Control Server."""
85
+
86
+ from egse.monitoring import MonitoringProtocol
87
+ from egse.services import ServiceProtocol
88
+
89
+ self._process_status = ProcessStatus()
90
+
91
+ self._timer_thread = threading.Thread(
92
+ target=do_every, args=(PROCESS_SETTINGS.METRICS_INTERVAL, self._process_status.update))
93
+ self._timer_thread.daemon = True
94
+ self._timer_thread.start()
95
+
96
+ # The logger will be overwritten by the sub-class, if not, we use this logger with the name of the sub-class.
97
+ # That will help us to identify which sub-class did not overwrite the logger attribute.
98
+
99
+ self.logger = logging.getLogger(get_full_classname(self))
100
+
101
+ self.interrupted = False
102
+ self.mon_delay = 1000 # Delay between publish status information [ms]
103
+ self.hk_delay = 1000 # Delay between saving housekeeping information [ms]
104
+
105
+ self.zcontext = zmq.Context.instance()
106
+ self.poller = zmq.Poller()
107
+
108
+ self.device_protocol = None # This will be set in the sub-class
109
+ self.service_protocol = ServiceProtocol(self)
110
+ self.monitoring_protocol = MonitoringProtocol(self)
111
+
112
+ # Set up the Control Server waiting for service requests
113
+
114
+ self.dev_ctrl_service_sock = self.zcontext.socket(zmq.REP)
115
+ self.service_protocol.bind(self.dev_ctrl_service_sock)
116
+
117
+ # Set up the Control Server for sending monitoring info
118
+
119
+ self.dev_ctrl_mon_sock = self.zcontext.socket(zmq.PUB)
120
+ self.monitoring_protocol.bind(self.dev_ctrl_mon_sock)
121
+
122
+ # Set up the Control Server waiting for device commands.
123
+ # The device protocol shall bind the socket in the sub-class
124
+
125
+ self.dev_ctrl_cmd_sock = self.zcontext.socket(zmq.REP)
126
+
127
+ # Initialise the poll set
128
+
129
+ self.poller.register(self.dev_ctrl_service_sock, zmq.POLLIN)
130
+ self.poller.register(self.dev_ctrl_mon_sock, zmq.POLLIN)
131
+
132
+ @abc.abstractmethod
133
+ def get_communication_protocol(self) -> str:
134
+ """ Returns the communication protocol used by the Control Server.
135
+
136
+ Returns: Communication protocol used by the Control Server, as specified in the settings.
137
+ """
138
+
139
+ pass
140
+
141
+ @abc.abstractmethod
142
+ def get_commanding_port(self) -> int:
143
+ """ Returns the commanding port used by the Control Server.
144
+
145
+ Returns: Commanding port used by the Control Server, as specified in the settings.
146
+ """
147
+
148
+ pass
149
+
150
+ @abc.abstractmethod
151
+ def get_service_port(self) -> int:
152
+ """ Returns the service port used by the Control Server.
153
+
154
+ Returns: Service port used by the Control Server, as specified in the settings.
155
+ """
156
+
157
+ pass
158
+
159
+ @abc.abstractmethod
160
+ def get_monitoring_port(self) -> int:
161
+ """ Returns the monitoring port used by the Control Server.
162
+
163
+ Returns: Monitoring port used by the Control Server, as specified in the settings.
164
+ """
165
+
166
+ pass
167
+
168
+ def get_ip_address(self) -> str:
169
+
170
+ return get_host_ip()
171
+
172
+ def get_storage_mnemonic(self) -> str:
173
+ """ Returns the storage mnemonics used by the Control Server.
174
+
175
+ This is a string that will appear in the filename with the housekeeping information of the device, as a way of
176
+ identifying the device. If this is not implemented in the sub-class, then the class name will be used.
177
+
178
+ Returns: Storage mnemonics used by the Control Server, as specified in the settings.
179
+ """
180
+
181
+ return self.__class__.__name__
182
+
183
+ def get_process_status(self) -> dict:
184
+ """ Returns the process status of the Control Server.
185
+
186
+ Returns: Dictionary with the process status of the Control Server.
187
+ """
188
+
189
+ return self._process_status.as_dict()
190
+
191
+ def get_average_execution_times(self) -> dict:
192
+ """ Returns the average execution times of all functions that have been monitored by this process.
193
+
194
+ Returns: Dictionary with the average execution times of all functions that have been monitored by this process.
195
+ The dictionary keys are the function names, and the values are the average execution times in ms.
196
+ """
197
+
198
+ return get_average_execution_times()
199
+
200
+ def set_mon_delay(self, seconds: float) -> float:
201
+ """ Sets the delay time for monitoring.
202
+
203
+ The delay time is the time between two successive executions of the `get_status()` function of the device
204
+ protocol.
205
+
206
+ It might happen that the delay time that is set is longer than what you requested. That is the case when the
207
+ execution of the `get_status()` function takes longer than the requested delay time. That should prevent the
208
+ server from blocking when a too short delay time is requested.
209
+
210
+ Args:
211
+ seconds (float): Number of seconds between the monitoring calls
212
+
213
+ Returns: Delay that was set [ms].
214
+ """
215
+
216
+ execution_time = get_average_execution_time(self.device_protocol.get_status)
217
+ self.mon_delay = max(seconds * 1000, (execution_time + 0.2) * 1000)
218
+
219
+ return self.mon_delay
220
+
221
+ def set_hk_delay(self, seconds: float) -> float:
222
+ """ Sets the delay time for housekeeping.
223
+
224
+ The delay time is the time between two successive executions of the `get_housekeeping()` function of the device
225
+ protocol.
226
+
227
+ It might happen that the delay time that is set is longer than what you requested. That is the case when the
228
+ execution of the `get_housekeeping()` function takes longer than the requested delay time. That should prevent
229
+ the server from blocking when a too short delay time is requested.
230
+
231
+ Args:
232
+ seconds (float): Number of seconds between the housekeeping calls
233
+
234
+ Returns: Delay that was set [ms].
235
+ """
236
+
237
+ execution_time = get_average_execution_time(self.device_protocol.get_housekeeping)
238
+ self.hk_delay = max(seconds * 1000, (execution_time + 0.2) * 1000)
239
+
240
+ return self.hk_delay
241
+
242
+ def set_logging_level(self, level: Union[int, str]) -> None:
243
+ """ Sets the logging level to the given level.
244
+
245
+ Allowed logging levels are:
246
+ - "CRITICAL" or 50
247
+ - "FATAL" or CRITICAL
248
+ - "ERROR" or 40
249
+ - "WARNING" or 30
250
+ - "WARN" or WARNING
251
+ - "INFO" or 20
252
+ - "DEBUG" or 10
253
+ - "NOTSET" or 0
254
+
255
+ Args:
256
+ level (int | str): Logging level to use, specified as either a string or an integer
257
+ """
258
+
259
+ self.logger.setLevel(level=level)
260
+
261
+ def quit(self) -> None:
262
+ """ Interrupts the Control Server."""
263
+
264
+ self.interrupted = True
265
+
266
+ def before_serve(self) -> None:
267
+ """ Steps to take before the Control Server is activated."""
268
+
269
+ pass
270
+
271
+ def after_serve(self) -> None:
272
+ """ Steps to take after the Control Server has been deactivated."""
273
+
274
+ pass
275
+
276
+ def is_storage_manager_active(self) -> bool:
277
+ """ Checks if the Storage Manager is active.
278
+
279
+ This method has to be implemented by the sub-class if you need to store information.
280
+
281
+ Note: You might want to set a specific timeout when checking for the Storage Manager.
282
+
283
+ Note: If this method returns True, the following methods shall also be implemented by the sub-class:
284
+
285
+ - register_to_storage_manager()
286
+ - unregister_from_storage_manager()
287
+ - store_housekeeping_information()
288
+
289
+ Returns: True if the Storage Manager is active; False otherwise.
290
+ """
291
+
292
+ return False
293
+
294
+ def serve(self) -> None:
295
+ """ Activation of the Control Server.
296
+
297
+ This comprises the following steps:
298
+
299
+ - Executing the `before_serve` method;
300
+ - Checking if the Storage Manager is active and registering the Control Server to it;
301
+ - Start listening for keyboard interrupts;
302
+ - Start accepting (listening to) commands;
303
+ - Start sending out monitoring information;
304
+ - Start sending out housekeeping information;
305
+ - Start listening for quit commands;
306
+ - After a quit command has been received:
307
+ - Unregister from the Storage Manager;
308
+ - Execute the `after_serve` method;
309
+ - Close all sockets;
310
+ - Clean up all threads.
311
+ """
312
+
313
+ self.before_serve()
314
+
315
+ # check if Storage Manager is available
316
+
317
+ storage_manager = self.is_storage_manager_active()
318
+
319
+ storage_manager and self.register_to_storage_manager()
320
+
321
+ # This approach is very simplistic and not time efficient
322
+ # We probably want to use a Timer that executes the monitoring and saving actions at
323
+ # dedicated times in the background.
324
+
325
+ # FIXME; we shall use the time.perf_counter() here!
326
+
327
+ last_time = time_in_ms()
328
+ last_time_hk = time_in_ms()
329
+
330
+ while True:
331
+ try:
332
+ socks = dict(self.poller.poll(50)) # timeout in milliseconds, do not block
333
+ except KeyboardInterrupt:
334
+ self.logger.warning("Keyboard interrupt caught!")
335
+ self.logger.warning(
336
+ "The ControlServer can not be interrupted with CTRL-C, send a quit command to the server instead."
337
+ )
338
+ continue
339
+
340
+ if self.dev_ctrl_cmd_sock in socks:
341
+ self.device_protocol.execute()
342
+
343
+ if self.dev_ctrl_service_sock in socks:
344
+ self.service_protocol.execute()
345
+
346
+ # Handle sending out monitoring information periodically, based on the MON_DELAY time that is specified in
347
+ # the YAML configuration file for the device
348
+
349
+ if time_in_ms() - last_time >= self.mon_delay:
350
+ last_time = time_in_ms()
351
+ # self.logger.debug("Sending status to monitoring processes.")
352
+ self.monitoring_protocol.send_status(
353
+ save_average_execution_time(self.device_protocol.get_status)
354
+ )
355
+
356
+ # Handle sending out housekeeping information periodically, based on the HK_DELAY time that is specified in
357
+ # the YAML configuration file for the device
358
+
359
+ if time_in_ms() - last_time_hk >= self.hk_delay:
360
+ last_time_hk = time_in_ms()
361
+ if storage_manager:
362
+ # self.logger.debug("Sending housekeeping information to Storage.")
363
+ self.store_housekeeping_information(
364
+ save_average_execution_time(self.device_protocol.get_housekeeping)
365
+ )
366
+
367
+ if self.interrupted:
368
+ self.logger.info(
369
+ f"Quit command received, closing down the {self.__class__.__name__}."
370
+ )
371
+ break
372
+
373
+ # Some device protocol sub-classes might start a number of threads or processes to support the commanding.
374
+ # Check if these threads/processes are still alive and terminate gracefully if they are not.
375
+
376
+ if not self.device_protocol.is_alive():
377
+ self.logger.error(
378
+ "Some Thread or sub-process that was started by Protocol has died, terminating..."
379
+ )
380
+ break
381
+
382
+ storage_manager and self.unregister_from_storage_manager()
383
+
384
+ self.after_serve()
385
+
386
+ self.device_protocol.quit()
387
+
388
+ self.dev_ctrl_mon_sock.close()
389
+ self.dev_ctrl_service_sock.close()
390
+ self.dev_ctrl_cmd_sock.close()
391
+
392
+ close_all_zmq_handlers()
393
+
394
+ self.zcontext.term()
395
+
396
+ def store_housekeeping_information(self, data: dict) -> None:
397
+ """ Sends housekeeping information to the Storage Manager.
398
+
399
+ This method has to be overwritten by the sub-classes if they want the device housekeeping information to be
400
+ saved.
401
+
402
+ Args:
403
+ data (dict): a dictionary containing parameter name and value of all device housekeeping. There is also
404
+ a timestamp that represents the date/time when the HK was received from the device.
405
+ """
406
+ pass
407
+
408
+ def register_to_storage_manager(self) -> None:
409
+ """ Registers this Control Server to the Storage Manager.
410
+
411
+ By doing so, the housekeeping information of the device will be sent to the Storage Manager, which will store
412
+ the information in a dedicated CSV file.
413
+
414
+ This method has to be overwritten by the sub-classes if they have housekeeping information that must be stored.
415
+
416
+ Subclasses need to overwrite this method if they have housekeeping information to be stored.
417
+
418
+ The following information is required for the registration:
419
+
420
+ - origin: Storage mnemonic, which can be retrieved from `self.get_storage_mnemonic()`
421
+ - persistence_class: Persistence layer (one of the TYPES in egse.storage.persistence)
422
+ - prep: depending on the type of the persistence class (see respective documentation)
423
+
424
+ The `egse.storage` module provides a convenience method that can be called from the method in the subclass:
425
+
426
+ >>> from egse.storage import register_to_storage_manager # noqa
427
+
428
+ Note: the `egse.storage` module might not be available, it is provided by the `cgse-core` package.
429
+ """
430
+ pass
431
+
432
+ def unregister_from_storage_manager(self) -> None:
433
+ """ Unregisters the Control Server from the Storage Manager.
434
+
435
+ This method has to be overwritten by the sub-classes.
436
+
437
+ The following information is required for the registration:
438
+
439
+ - origin: Storage mnemonic, which can be retrieved from `self.get_storage_mnemonic()`
440
+
441
+ The `egse.storage` module provides a convenience method that can be called from the method in the sub-class:
442
+
443
+ >>> from egse.storage import unregister_from_storage_manager # noqa
444
+
445
+ Note: the `egse.storage` module might not be available, it is provided by the `cgse-core` package.
446
+ """
447
+
448
+ pass
@@ -152,6 +152,7 @@ class DeviceConnectionInterface(DeviceConnectionObservable):
152
152
  Raises:
153
153
  ConnectionError: when the connection can not be opened.
154
154
  """
155
+
155
156
  raise NotImplementedError
156
157
 
157
158
  @dynamic_interface
@@ -187,13 +188,13 @@ class DeviceInterface(DeviceConnectionInterface):
187
188
 
188
189
  @dynamic_interface
189
190
  def is_simulator(self) -> bool:
190
- """Ask if the device class is a Simulator instead of the real Controller.
191
+ """ Checks whether the device is a simulator rather than a real hardware controller.
191
192
 
192
193
  This can be useful for testing purposes or when doing actual movement simulations.
193
194
 
194
- Returns:
195
- True if the Device is a Simulator, False if the Device is connected to real hardware.
195
+ Returns: True if the Device is a Simulator; False if the Device is connected to real hardware.
196
196
  """
197
+
197
198
  raise NotImplementedError
198
199
 
199
200
 
@@ -28,6 +28,7 @@ __all__ = [
28
28
  "add_cr_lf",
29
29
  "dynamic_command",
30
30
  "DynamicCommandMixin",
31
+ "CommandType"
31
32
  ]
32
33
 
33
34
  # ----- Mixin for dynamic commanding ---------------------------------------------------------------
@@ -107,6 +108,12 @@ def expand_kwargs(kwargs: Dict):
107
108
  """Expand keyword arguments and their values as 'key=value' separated by spaces."""
108
109
  return " ".join(f"{k}={v}" for k, v in kwargs.items())
109
110
 
111
+ class CommandType(enum.Enum, str):
112
+
113
+ READ = "read"
114
+ WRITE = "write"
115
+ TRANSACTION = "transaction"
116
+
110
117
 
111
118
  def dynamic_command(
112
119
  *,
@@ -163,7 +163,7 @@ class BaseCommandProtocol(DeviceConnectionObserver):
163
163
  """
164
164
  status = {
165
165
  "timestamp": format_datetime(),
166
- "delay": self.__control_server.delay,
166
+ "delay": self.__control_server.mon_delay,
167
167
  }
168
168
  status.update(self.__control_server.get_process_status())
169
169
  return status
@@ -386,7 +386,7 @@ class CommandProtocol(DeviceConnectionObserver, metaclass=abc.ABCMeta):
386
386
 
387
387
  def quit(self):
388
388
  """
389
- This method can be overridden by a sub-class to cleanup and stop threads that it
389
+ This method can be overridden by a sub-class to clean up and stop threads that it
390
390
  started.
391
391
  """
392
392
 
@@ -444,7 +444,7 @@ class CommandProtocol(DeviceConnectionObserver, metaclass=abc.ABCMeta):
444
444
  """
445
445
  status = {
446
446
  "timestamp": format_datetime(),
447
- "delay": self.control_server.delay,
447
+ "delay": self.control_server.mon_delay,
448
448
  }
449
449
  status.update(self.control_server.get_process_status())
450
450
  return status
@@ -25,7 +25,7 @@ LOGGER = logging.getLogger(__name__)
25
25
 
26
26
  HERE = Path(__file__).parent
27
27
 
28
- SERVICE_SETTINGS = Settings.load(filename=str(HERE / "services.yaml"))
28
+ SERVICE_SETTINGS = Settings.load(location=HERE, filename="services.yaml")
29
29
 
30
30
 
31
31
  class ServiceCommand(ClientServerCommand):
@@ -57,7 +57,7 @@ class ServiceProtocol(CommandProtocol):
57
57
  Returns:
58
58
  Sends back the selected delay time in milliseconds.
59
59
  """
60
- delay = self.control_server.set_delay(1.0 / freq)
60
+ delay = self.control_server.set_mon_delay(1.0 / freq)
61
61
 
62
62
  LOGGER.debug(f"Set monitoring frequency to {freq}Hz, ± every {delay:.0f}ms.")
63
63
 
@@ -266,7 +266,8 @@ def _get_attribute(self, name, default):
266
266
  def _parse_filename_for_setup_id(filename: str):
267
267
  """Returns the setup_id from the filename, or None when no match was found."""
268
268
 
269
- match = re.search(r"SETUP_([^_]+)_(\d+)", filename)
269
+ # match = re.search(r"SETUP_([^_]+)_(\d+)", filename)
270
+ match = re.search(r"SETUP_(\w+)_([\d]{5})_([\d]{6})_([\d]{6})\.yaml", filename)
270
271
 
271
272
  # TypeError when match is None
272
273
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-coordinates"
3
- version = "2025.0.6"
3
+ version = "2025.0.8"
4
4
  description = "Reference Frames and Coordinate Transofrmations 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-core"
3
- version = "2025.0.6"
3
+ version = "2025.0.8"
4
4
  description = "Core services for the CGSE framework"
5
5
  authors = [
6
6
  {name = "IVS KU Leuven"}
@@ -26,6 +26,7 @@ dependencies = [
26
26
  "prometheus-client>=0.21.1",
27
27
  "pyzmq == 23.2.1",
28
28
  "rich>=13.9.4",
29
+ "typer>=0.15.1",
29
30
  ]
30
31
 
31
32
  [project.scripts]
@@ -34,7 +35,7 @@ sm_cs = 'egse.storage.storage_cs:cli'
34
35
  cm_cs = 'egse.confman.confman_cs:cli'
35
36
  pm_cs = 'egse.procman.procman_cs:cli'
36
37
 
37
- cgse = 'scripts.cgse:cli'
38
+ cgse = 'scripts.cgse:app'
38
39
 
39
40
  [project.entry-points."cgse.version"]
40
41
  cgse-core = 'egse'
@@ -153,7 +153,7 @@ def status():
153
153
  import rich
154
154
  from egse.confman import get_status
155
155
 
156
- rich.print(get_status())
156
+ rich.print(get_status(), end='')
157
157
 
158
158
 
159
159
  @cli.command()
@@ -486,7 +486,7 @@ class ProcessManagerController(ProcessManagerInterface):
486
486
 
487
487
  if process_name == "DAQ6510":
488
488
  setup = GlobalState.setup
489
- das_delay = setup.gse.DAQ6510.route.delay
489
+ das_delay = setup.gse.DAQ6510.route.mon_delay
490
490
  das_count = setup.gse.DAQ6510.route.scan.COUNT.SCAN
491
491
  das_interval = setup.gse.DAQ6510.route.scan.INTERVAL
492
492
 
@@ -17,7 +17,6 @@ from apscheduler.schedulers.background import BackgroundScheduler
17
17
  from prometheus_client import start_http_server
18
18
  from pytz import utc
19
19
 
20
- from egse.bits import humanize_bytes
21
20
  from egse.control import ControlServer
22
21
  from egse.env import get_data_storage_location
23
22
  from egse.env import get_site_id
@@ -26,8 +25,6 @@ from egse.settings import Settings
26
25
  from egse.storage import StorageProtocol
27
26
  from egse.storage import StorageProxy
28
27
  from egse.storage import cycle_daily_files
29
- from egse.storage import is_storage_manager_active
30
- from egse.system import replace_environment_variable
31
28
 
32
29
  # Use explicit name here otherwise the logger will probably be called __main__
33
30
 
@@ -145,7 +142,7 @@ def status(full):
145
142
  import rich
146
143
  from egse.storage import get_status
147
144
 
148
- rich.print(get_status(full=full))
145
+ rich.print(get_status(full=full), end='')
149
146
 
150
147
 
151
148
  def check_prerequisites():