cgse 0.11.4__tar.gz → 0.12.0__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 (519) hide show
  1. cgse-0.12.0/.github/workflows/ruff-format-check.yaml +19 -0
  2. {cgse-0.11.4 → cgse-0.12.0}/PKG-INFO +2 -2
  3. cgse-0.12.0/advanced-process-monitoring.py +111 -0
  4. {cgse-0.11.4 → cgse-0.12.0}/bump.py +7 -8
  5. cgse-0.12.0/docs/dev_guide/monitoring.md +261 -0
  6. cgse-0.12.0/docs/images/grafana-queries.png +0 -0
  7. {cgse-0.11.4 → cgse-0.12.0}/docs/libs/cgse-core/registry.md +2 -3
  8. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/noxfile.py +2 -2
  9. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/pyproject.toml +2 -2
  10. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/service_registry.db +0 -0
  11. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/cgse_common/__init__.py +1 -0
  12. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/cgse_common/cgse.py +5 -5
  13. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/async_control_claude.py +5 -3
  14. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/command.py +2 -2
  15. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/control.py +45 -34
  16. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/dummy.py +7 -9
  17. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/plugin.py +3 -3
  18. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/process.py +83 -0
  19. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/protocol.py +6 -2
  20. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/proxy.py +1 -1
  21. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/ratelimit.py +23 -11
  22. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/scpi.py +16 -25
  23. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/services.py +49 -32
  24. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/services.yaml +5 -0
  25. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/setup.py +7 -5
  26. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/signal.py +11 -14
  27. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/socketdevice.py +8 -18
  28. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/system.py +31 -29
  29. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/task.py +1 -2
  30. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/zmq_ser.py +3 -3
  31. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/scripts/handle_sigterm.py +2 -2
  32. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_client_server_interaction.py +0 -6
  33. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_command.py +3 -5
  34. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_decorators.py +2 -0
  35. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_device.py +2 -5
  36. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_process.py +0 -1
  37. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_protocol.py +5 -8
  38. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_ratelimit.py +9 -22
  39. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_signal.py +3 -4
  40. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_system.py +39 -30
  41. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_task.py +0 -3
  42. cgse-0.12.0/libs/cgse-common/tests/test_zmq_ser.py +71 -0
  43. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/pyproject.toml +2 -2
  44. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/__init__.py +15 -17
  45. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/avoidance.py +6 -5
  46. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/laser_tracker_to_dict.py +8 -9
  47. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/point.py +101 -101
  48. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/pyplot.py +20 -22
  49. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/referenceFrame.py +30 -61
  50. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/refmodel.py +16 -33
  51. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/rotationMatrix.py +21 -24
  52. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/transform3d_addon.py +111 -93
  53. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_avoidance.py +5 -5
  54. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_coordinates_plot.py +2 -4
  55. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_coordinates_serialize.py +3 -10
  56. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_point.py +2 -2
  57. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_reference_frames.py +5 -29
  58. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_refmodel.py +7 -21
  59. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/pyproject.toml +2 -2
  60. cgse-0.12.0/libs/cgse-core/src/cgse_core/_start.py +75 -0
  61. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/cgse_core/_status.py +23 -20
  62. cgse-0.12.0/libs/cgse-core/src/cgse_core/_stop.py +75 -0
  63. cgse-0.12.0/libs/cgse-core/src/cgse_core/cgse_explore.py +19 -0
  64. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/cgse_core/services.py +15 -6
  65. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/async_control.py +73 -89
  66. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/confman/__init__.py +38 -89
  67. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/confman/confman_cs.py +32 -19
  68. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/logger/__init__.py +6 -9
  69. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/logger/__main__.py +0 -3
  70. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/logger/log_cs.py +39 -40
  71. cgse-0.12.0/libs/cgse-core/src/egse/notifyhub/event.py +11 -0
  72. cgse-0.12.0/libs/cgse-core/src/egse/notifyhub/server.py +135 -0
  73. cgse-0.12.0/libs/cgse-core/src/egse/notifyhub/services.py +176 -0
  74. cgse-0.12.0/libs/cgse-core/src/egse/notifyhub/test.py +296 -0
  75. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/procman/__init__.py +39 -50
  76. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/procman/procman_cs.py +22 -34
  77. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/procman/procman_protocol.py +4 -5
  78. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/procman/procman_ui.py +122 -124
  79. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/registry/__init__.py +7 -6
  80. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/registry/backend.py +2 -1
  81. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/registry/client.py +138 -197
  82. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/registry/server.py +96 -153
  83. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/registry/service.py +25 -67
  84. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/storage/__init__.py +43 -61
  85. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/storage/persistence.py +33 -40
  86. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/storage/storage_cs.py +10 -18
  87. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/conftest.py +0 -1
  88. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/fixtures/helpers.py +16 -16
  89. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/script_test_async_registry_client.py +28 -36
  90. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/script_test_registry_client_server.py +20 -24
  91. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/script_test_service_registry_server.py +14 -30
  92. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/script_test_sync_registry_client.py +27 -39
  93. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/services.py +32 -67
  94. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/stress_test_registry_server.py +6 -9
  95. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/test_async_control.py +2 -4
  96. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/test_cm_cs.py +9 -15
  97. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/test_confman_setups.py +5 -5
  98. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/test_logger.py +1 -5
  99. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/test_registry_backend.py +13 -39
  100. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/test_registry_service.py +71 -249
  101. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/test_server_running.py +3 -7
  102. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/test_server_running_with_fixture.py +2 -5
  103. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/test_settings_core.py +3 -6
  104. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/test_zmq_microservice.py +0 -2
  105. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/pyproject.toml +2 -2
  106. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/__init__.py +1 -1
  107. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/buttons.py +28 -34
  108. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/led.py +7 -6
  109. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/limitswitch.py +5 -4
  110. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/states.py +19 -15
  111. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/switch.py +1 -4
  112. cgse-0.12.0/live-process-monitoring.py +67 -0
  113. {cgse-0.11.4 → cgse-0.12.0}/noxfile.py +2 -1
  114. cgse-0.12.0/processes.json +7680 -0
  115. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/cgse-tools/pyproject.toml +2 -2
  116. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/cgse-tools/src/cgse_tools/cgse_clock.py +1 -1
  117. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/cgse-tools/src/cgse_tools/cgse_commands.py +103 -30
  118. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/cgse-tools/src/cgse_tools/cgse_services.py +1 -3
  119. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/cgse-tools/src/egse/tools/status.py +8 -7
  120. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/pyproject.toml +2 -2
  121. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_adev.py +4 -8
  122. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_cs.py +12 -39
  123. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_dev.py +1 -1
  124. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_mon.py +36 -83
  125. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_protocol.py +35 -18
  126. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510_sim.py +2 -4
  127. cgse-0.12.0/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +19 -0
  128. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_services.py +1 -17
  129. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/tests/script_daq6510_mon.py +2 -6
  130. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/tests/test_adev.py +6 -25
  131. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/tests/test_dev.py +6 -24
  132. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/pyproject.toml +2 -2
  133. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.py +61 -87
  134. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_cs.py +35 -34
  135. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_devif.py +17 -18
  136. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336_protocol.py +11 -16
  137. cgse-0.12.0/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +20 -0
  138. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_services.py +26 -14
  139. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/tests/test_lakeshore336_simulator.py +10 -15
  140. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/pyproject.toml +2 -2
  141. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/__init__.py +2 -1
  142. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/__init__.py +21 -11
  143. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/alpha.py +3 -10
  144. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/dynalpha.py +128 -73
  145. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod.py +73 -45
  146. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/hexapod_ui.py +15 -51
  147. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.py +40 -17
  148. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_cs.py +3 -8
  149. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_protocol.py +4 -14
  150. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran_ui.py +6 -18
  151. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac.py +9 -28
  152. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/pmac_regex.py +2 -2
  153. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.py +17 -42
  154. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_cs.py +19 -23
  155. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_protocol.py +4 -11
  156. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_sim.py +2 -4
  157. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna_ui.py +6 -26
  158. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/punaplus.py +3 -5
  159. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.py +51 -41
  160. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_cs.py +19 -23
  161. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_devif.py +14 -11
  162. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_protocol.py +4 -14
  163. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda_ui.py +7 -18
  164. cgse-0.12.0/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +19 -0
  165. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_services.py +25 -40
  166. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/tests/test_puna.py +0 -4
  167. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/tests/test_puna_cs.py +0 -1
  168. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/tests/test_puna_simulator.py +12 -18
  169. {cgse-0.11.4 → cgse-0.12.0}/projects/plato/plato-fits/pyproject.toml +2 -2
  170. {cgse-0.11.4 → cgse-0.12.0}/projects/plato/plato-fits/src/egse/plugins/storage/fits.py +350 -204
  171. {cgse-0.11.4 → cgse-0.12.0}/projects/plato/plato-hdf5/pyproject.toml +2 -2
  172. {cgse-0.11.4 → cgse-0.12.0}/projects/plato/plato-hdf5/src/egse/plugins/storage/hdf5.py +6 -6
  173. cgse-0.12.0/projects/plato/plato-spw/README.md +0 -0
  174. {cgse-0.11.4 → cgse-0.12.0}/projects/plato/plato-spw/pyproject.toml +2 -2
  175. {cgse-0.11.4 → cgse-0.12.0}/projects/plato/plato-spw/src/egse/spw.py +60 -67
  176. {cgse-0.11.4 → cgse-0.12.0}/pyproject.toml +2 -2
  177. cgse-0.12.0/requirements.txt +1728 -0
  178. {cgse-0.11.4 → cgse-0.12.0}/scratch.py +2 -4
  179. {cgse-0.11.4 → cgse-0.12.0}/service_registry.db +0 -0
  180. {cgse-0.11.4/libs/cgse-common → cgse-0.12.0}/service_registry.db-shm +0 -0
  181. cgse-0.12.0/service_registry.db-wal +0 -0
  182. cgse-0.12.0/simple-process-monitoring.py +72 -0
  183. cgse-0.11.4/libs/cgse-common/service_registry.db-wal +0 -0
  184. cgse-0.11.4/libs/cgse-common/tests/test_zmq_ser.py +0 -70
  185. cgse-0.11.4/libs/cgse-core/src/cgse_core/_start.py +0 -65
  186. cgse-0.11.4/libs/cgse-core/src/cgse_core/_stop.py +0 -65
  187. cgse-0.11.4/libs/cgse-core/src/cgse_core/cgse_explore.py +0 -10
  188. cgse-0.11.4/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/cgse_explore.py +0 -10
  189. cgse-0.11.4/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/cgse_explore.py +0 -10
  190. cgse-0.11.4/projects/generic/symetrie-hexapod/src/symetrie_hexapod/cgse_explore.py +0 -10
  191. {cgse-0.11.4 → cgse-0.12.0}/.gitignore +0 -0
  192. {cgse-0.11.4 → cgse-0.12.0}/README.md +0 -0
  193. {cgse-0.11.4 → cgse-0.12.0}/TODO.md +0 -0
  194. {cgse-0.11.4 → cgse-0.12.0}/check_import.py +0 -0
  195. {cgse-0.11.4 → cgse-0.12.0}/conftest.py +0 -0
  196. {cgse-0.11.4 → cgse-0.12.0}/docs/api/bits.md +0 -0
  197. {cgse-0.11.4 → cgse-0.12.0}/docs/api/calibration.md +0 -0
  198. {cgse-0.11.4 → cgse-0.12.0}/docs/api/command.md +0 -0
  199. {cgse-0.11.4 → cgse-0.12.0}/docs/api/config.md +0 -0
  200. {cgse-0.11.4 → cgse-0.12.0}/docs/api/control.md +0 -0
  201. {cgse-0.11.4 → cgse-0.12.0}/docs/api/counter.md +0 -0
  202. {cgse-0.11.4 → cgse-0.12.0}/docs/api/decorators.md +0 -0
  203. {cgse-0.11.4 → cgse-0.12.0}/docs/api/device.md +0 -0
  204. {cgse-0.11.4 → cgse-0.12.0}/docs/api/dicts.md +0 -0
  205. {cgse-0.11.4 → cgse-0.12.0}/docs/api/dummy.md +0 -0
  206. {cgse-0.11.4 → cgse-0.12.0}/docs/api/env.md +0 -0
  207. {cgse-0.11.4 → cgse-0.12.0}/docs/api/exceptions.md +0 -0
  208. {cgse-0.11.4 → cgse-0.12.0}/docs/api/heartbeat.md +0 -0
  209. {cgse-0.11.4 → cgse-0.12.0}/docs/api/hk.md +0 -0
  210. {cgse-0.11.4 → cgse-0.12.0}/docs/api/index.md +0 -0
  211. {cgse-0.11.4 → cgse-0.12.0}/docs/api/listener.md +0 -0
  212. {cgse-0.11.4 → cgse-0.12.0}/docs/api/metrics.md +0 -0
  213. {cgse-0.11.4 → cgse-0.12.0}/docs/api/mixin.md +0 -0
  214. {cgse-0.11.4 → cgse-0.12.0}/docs/api/monitoring.md +0 -0
  215. {cgse-0.11.4 → cgse-0.12.0}/docs/api/observer.md +0 -0
  216. {cgse-0.11.4 → cgse-0.12.0}/docs/api/obsid.md +0 -0
  217. {cgse-0.11.4 → cgse-0.12.0}/docs/api/persistence.md +0 -0
  218. {cgse-0.11.4 → cgse-0.12.0}/docs/api/plugin.md +0 -0
  219. {cgse-0.11.4 → cgse-0.12.0}/docs/api/process.md +0 -0
  220. {cgse-0.11.4 → cgse-0.12.0}/docs/api/reload.md +0 -0
  221. {cgse-0.11.4 → cgse-0.12.0}/docs/api/settings.md +0 -0
  222. {cgse-0.11.4 → cgse-0.12.0}/docs/api/setup.md +0 -0
  223. {cgse-0.11.4 → cgse-0.12.0}/docs/api/system.md +0 -0
  224. {cgse-0.11.4 → cgse-0.12.0}/docs/custom_theme/main.html +0 -0
  225. {cgse-0.11.4 → cgse-0.12.0}/docs/dev_guide/coding_style.md +0 -0
  226. {cgse-0.11.4 → cgse-0.12.0}/docs/dev_guide/docs.md +0 -0
  227. {cgse-0.11.4 → cgse-0.12.0}/docs/dev_guide/index.md +0 -0
  228. {cgse-0.11.4 → cgse-0.12.0}/docs/dev_guide/installation.md +0 -0
  229. {cgse-0.11.4 → cgse-0.12.0}/docs/dev_guide/monorepo.md +0 -0
  230. {cgse-0.11.4 → cgse-0.12.0}/docs/dev_guide/nox.md +0 -0
  231. {cgse-0.11.4 → cgse-0.12.0}/docs/dev_guide/plugins.md +0 -0
  232. {cgse-0.11.4 → cgse-0.12.0}/docs/dev_guide/project-configuration.md +0 -0
  233. {cgse-0.11.4 → cgse-0.12.0}/docs/dev_guide/unit_testing.md +0 -0
  234. {cgse-0.11.4 → cgse-0.12.0}/docs/dev_guide/uv.md +0 -0
  235. {cgse-0.11.4 → cgse-0.12.0}/docs/dev_guide/versioning.md +0 -0
  236. {cgse-0.11.4 → cgse-0.12.0}/docs/getting_started.md +0 -0
  237. {cgse-0.11.4 → cgse-0.12.0}/docs/help.md +0 -0
  238. {cgse-0.11.4 → cgse-0.12.0}/docs/images/github-fork-clone-dark.png +0 -0
  239. {cgse-0.11.4 → cgse-0.12.0}/docs/images/github-fork-clone.png +0 -0
  240. {cgse-0.11.4 → cgse-0.12.0}/docs/images/icons/cgse-logo-blue.svg +0 -0
  241. {cgse-0.11.4 → cgse-0.12.0}/docs/images/icons/cgse-logo.svg +0 -0
  242. {cgse-0.11.4 → cgse-0.12.0}/docs/index.md +0 -0
  243. {cgse-0.11.4 → cgse-0.12.0}/docs/initialize.md +0 -0
  244. {cgse-0.11.4 → cgse-0.12.0}/docs/libs/cgse-common/images/load_methods.png +0 -0
  245. {cgse-0.11.4 → cgse-0.12.0}/docs/libs/cgse-common/index.md +0 -0
  246. {cgse-0.11.4 → cgse-0.12.0}/docs/libs/cgse-common/settings.md +0 -0
  247. {cgse-0.11.4 → cgse-0.12.0}/docs/libs/cgse-common/setup.md +0 -0
  248. {cgse-0.11.4 → cgse-0.12.0}/docs/libs/cgse-coordinates/index.md +0 -0
  249. {cgse-0.11.4 → cgse-0.12.0}/docs/libs/cgse-core/index.md +0 -0
  250. {cgse-0.11.4 → cgse-0.12.0}/docs/libs/cgse-gui/index.md +0 -0
  251. {cgse-0.11.4 → cgse-0.12.0}/docs/libs/index.md +0 -0
  252. {cgse-0.11.4 → cgse-0.12.0}/docs/package_list.md +0 -0
  253. {cgse-0.11.4 → cgse-0.12.0}/docs/projects/cgse-tools.md +0 -0
  254. {cgse-0.11.4 → cgse-0.12.0}/docs/projects/index.md +0 -0
  255. {cgse-0.11.4 → cgse-0.12.0}/docs/projects/symetrie-hexapod.md +0 -0
  256. {cgse-0.11.4 → cgse-0.12.0}/docs/roadmap.md +0 -0
  257. {cgse-0.11.4 → cgse-0.12.0}/docs/stylesheets/custom.css +0 -0
  258. {cgse-0.11.4 → cgse-0.12.0}/docs/stylesheets/extra.css +0 -0
  259. {cgse-0.11.4 → cgse-0.12.0}/docs/tutorial.md +0 -0
  260. {cgse-0.11.4 → cgse-0.12.0}/docs/user_guide/index.md +0 -0
  261. {cgse-0.11.4 → cgse-0.12.0}/identifier.sqlite +0 -0
  262. {cgse-0.11.4 → cgse-0.12.0}/justfile +0 -0
  263. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/README.md +0 -0
  264. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/justfile +0 -0
  265. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/cgse_common/settings.yaml +0 -0
  266. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/bits.py +0 -0
  267. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/calibration.py +0 -0
  268. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/config.py +0 -0
  269. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/counter.py +0 -0
  270. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/decorators.py +0 -0
  271. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/device.py +0 -0
  272. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/dicts.py +0 -0
  273. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/env.py +0 -0
  274. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/exceptions.py +0 -0
  275. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/heartbeat.py +0 -0
  276. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/hk.py +0 -0
  277. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/listener.py +0 -0
  278. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/metrics.py +0 -0
  279. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/mixin.py +0 -0
  280. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/monitoring.py +0 -0
  281. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/observer.py +0 -0
  282. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/obsid.py +0 -0
  283. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/persistence.py +0 -0
  284. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/py.typed +0 -0
  285. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/randomwalk.py +0 -0
  286. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/reload.py +0 -0
  287. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/resource.py +0 -0
  288. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/response.py +0 -0
  289. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/settings.py +0 -0
  290. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/settings.yaml +0 -0
  291. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/state.py +0 -0
  292. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/src/egse/version.py +0 -0
  293. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/conftest.py +0 -0
  294. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/COPYING +0 -0
  295. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00028_201028_155259.yaml +0 -0
  296. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00029_201028_155331.yaml +0 -0
  297. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00030_210311_134043.yaml +0 -0
  298. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00080_210917_105245.yaml +0 -0
  299. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00081_210922_142259.yaml +0 -0
  300. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL/conf/SETUP_CSL_00082_210923_094458.yaml +0 -0
  301. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL1/README.md +0 -0
  302. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/CSL2/README.md +0 -0
  303. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/IAS/README.md +0 -0
  304. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/INTA/README.md +0 -0
  305. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/LAB23/README.md +0 -0
  306. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00027_211119_140441.yaml +0 -0
  307. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00028_211119_160406.yaml +0 -0
  308. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00029_211119_172918.yaml +0 -0
  309. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00030_211122_103604.yaml +0 -0
  310. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/SRON/conf/SETUP_SRON_00031_211123_124900.yaml +0 -0
  311. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/common/telemetry/tm-dictionary-default.csv +0 -0
  312. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/conf/SETUP_20250114_1519.yaml +0 -0
  313. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/conf/config-file.toml +0 -0
  314. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/data/cal_coeff_1234.csv +0 -0
  315. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/data/calibration.csv +0 -0
  316. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/data/calibration.yaml +0 -0
  317. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/data/command.yaml +0 -0
  318. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/data/corrupt.yaml +0 -0
  319. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/data/data-file.txt +0 -0
  320. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/data/empty_data_file.txt +0 -0
  321. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/data/empty_yaml_file.yaml +0 -0
  322. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/data/local_settings.yaml +0 -0
  323. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/data/new_local_settings.yaml +0 -0
  324. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/data/test_setup.yaml +0 -0
  325. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/icons/hourglass.svg +0 -0
  326. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/icons/keyboard.png +0 -0
  327. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/icons/soap_sponge.svg +0 -0
  328. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/lib/dev1/shared-lib.so +0 -0
  329. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/data/lib/dev2/shared-lib.so +0 -0
  330. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/fixtures/default_env.py +0 -0
  331. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/fixtures/helpers.py +0 -0
  332. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/scripts/empty_process.py +0 -0
  333. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/scripts/process_with_children.py +0 -0
  334. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/scripts/raise_value_error.py +0 -0
  335. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/scripts/void-0.py +0 -0
  336. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/scripts/void-1.py +0 -0
  337. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_bits.py +1 -1
  338. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_config.py +0 -0
  339. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_control.py +0 -0
  340. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_env.py +0 -0
  341. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_fixtures.py +0 -0
  342. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_hk.py +0 -0
  343. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_listener.py +0 -0
  344. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_mixin.py +0 -0
  345. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_resource.py +0 -0
  346. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_response.py +0 -0
  347. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_settings.py +0 -0
  348. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-common/tests/test_setup.py +0 -0
  349. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/README.md +0 -0
  350. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/cgse_coordinates/__init__.py +0 -0
  351. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/cgse_coordinates/settings.yaml +0 -0
  352. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/src/egse/coordinates/cslmodel.py +1 -1
  353. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-coordinates/tests/test_ref_model.py +0 -0
  354. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/.envrc.disabled +0 -0
  355. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/README.md +0 -0
  356. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/service_registry.db +0 -0
  357. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/cgse_core/__init__.py +0 -0
  358. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/cgse_core/settings.yaml +0 -0
  359. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/confman/__main__.py +0 -0
  360. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/confman/confman.yaml +0 -0
  361. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/busy.svg +0 -0
  362. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/operational-mode.svg +0 -0
  363. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/pm_ui.svg +0 -0
  364. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/simulator-mode.svg +0 -0
  365. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/start-process-button.svg +0 -0
  366. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/stop-process-button.svg +0 -0
  367. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/icons/user-interface.svg +0 -0
  368. {cgse-0.11.4/projects/generic/cgse-tools/src/cgse_tools → cgse-0.12.0/libs/cgse-core/src/egse/notifyhub}/__init__.py +0 -0
  369. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/procman/procman.yaml +0 -0
  370. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/storage/__main__.py +0 -0
  371. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/src/egse/storage/storage.yaml +0 -0
  372. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/data/local_settings.yaml +0 -0
  373. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/fixtures/default_env.py +1 -1
  374. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-core/tests/fixtures/services.py +0 -0
  375. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/README.md +0 -0
  376. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-start.svg +0 -0
  377. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu-cs-stop.svg +0 -0
  378. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu-cs.svg +0 -0
  379. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-started.svg +0 -0
  380. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu_cs-stopped.svg +0 -0
  381. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/aeu_cs.svg +0 -0
  382. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/alert.svg +0 -0
  383. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/arrow-double-left.png +0 -0
  384. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/arrow-double-right.png +0 -0
  385. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/arrow-up.svg +0 -0
  386. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/backward.svg +0 -0
  387. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/busy.svg +0 -0
  388. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/cleaning.svg +0 -0
  389. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/color-scheme.svg +0 -0
  390. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/cs-connected-alert.svg +0 -0
  391. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/cs-connected-disabled.svg +0 -0
  392. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/cs-connected.svg +0 -0
  393. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/cs-not-connected.svg +0 -0
  394. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/double-left-arrow.svg +0 -0
  395. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/double-right-arrow.svg +0 -0
  396. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/erase-disabled.svg +0 -0
  397. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/erase.svg +0 -0
  398. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fitsgen-start.svg +0 -0
  399. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fitsgen-stop.svg +0 -0
  400. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fitsgen.svg +0 -0
  401. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/forward.svg +0 -0
  402. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fov-hk-start.svg +0 -0
  403. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fov-hk-stop.svg +0 -0
  404. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/fov-hk.svg +0 -0
  405. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/front-desk.svg +0 -0
  406. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/home-actioned.svg +0 -0
  407. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/home-disabled.svg +0 -0
  408. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/home.svg +0 -0
  409. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/info.svg +0 -0
  410. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/invalid.png +0 -0
  411. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-green.svg +0 -0
  412. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-grey.svg +0 -0
  413. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-orange.svg +0 -0
  414. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-red.svg +0 -0
  415. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-square-green.svg +0 -0
  416. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-square-grey.svg +0 -0
  417. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-square-orange.svg +0 -0
  418. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/led-square-red.svg +0 -0
  419. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-green.svg +0 -0
  420. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-all-red.svg +0 -0
  421. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el+.svg +0 -0
  422. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/limit-switch-el-.svg +0 -0
  423. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/location-marker.svg +0 -0
  424. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-dpu.svg +0 -0
  425. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-gimbal.svg +0 -0
  426. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-huber.svg +0 -0
  427. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-ogse.svg +0 -0
  428. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-puna.svg +0 -0
  429. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-tcs.svg +0 -0
  430. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/logo-zonda.svg +0 -0
  431. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/maximize.svg +0 -0
  432. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/meter.svg +0 -0
  433. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/more.svg +0 -0
  434. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-start.svg +0 -0
  435. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk-stop.svg +0 -0
  436. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/n-fee-hk.svg +0 -0
  437. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/observing-off.svg +0 -0
  438. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/observing-on.svg +0 -0
  439. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.png +0 -0
  440. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/open-document-hdf5.svg +0 -0
  441. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/ops-mode.svg +0 -0
  442. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/play-green.svg +0 -0
  443. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/plugged-disabled.svg +0 -0
  444. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/plugged.svg +0 -0
  445. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/pm_ui.svg +0 -0
  446. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/power-button-green.svg +0 -0
  447. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/power-button-red.svg +0 -0
  448. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/power-button.svg +0 -0
  449. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/radar.svg +0 -0
  450. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/radioactive.svg +0 -0
  451. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/reload.svg +0 -0
  452. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/remote-control-off.svg +0 -0
  453. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/remote-control-on.svg +0 -0
  454. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/repeat-blue.svg +0 -0
  455. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/repeat.svg +0 -0
  456. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/settings.svg +0 -0
  457. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/shrink.svg +0 -0
  458. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/shutter.svg +0 -0
  459. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/sign-off.svg +0 -0
  460. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/sign-on.svg +0 -0
  461. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/sim-mode.svg +0 -0
  462. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/small-buttons-go.svg +0 -0
  463. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/small-buttons-minus.svg +0 -0
  464. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/small-buttons-plus.svg +0 -0
  465. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/sponge.svg +0 -0
  466. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/start-button-disabled.svg +0 -0
  467. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/start-button.svg +0 -0
  468. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/stop-button-disabled.svg +0 -0
  469. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/stop-button.svg +0 -0
  470. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/stop-red.svg +0 -0
  471. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/stop.svg +0 -0
  472. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-disabled-square.svg +0 -0
  473. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-disabled.svg +0 -0
  474. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-off-square.svg +0 -0
  475. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-off.svg +0 -0
  476. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-on-square.svg +0 -0
  477. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/switch-on.svg +0 -0
  478. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/temperature-control.svg +0 -0
  479. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/th_ui_logo.svg +0 -0
  480. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/unplugged.svg +0 -0
  481. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/unvalid.png +0 -0
  482. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/user-interface.svg +0 -0
  483. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/vacuum.svg +0 -0
  484. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/valid.png +0 -0
  485. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-dark.svg +0 -0
  486. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/icons/zoom-to-pixel-white.svg +0 -0
  487. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/styles/dark.qss +0 -0
  488. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/styles/default.qss +0 -0
  489. {cgse-0.11.4 → cgse-0.12.0}/libs/cgse-gui/src/egse/gui/styles.qss +0 -0
  490. {cgse-0.11.4 → cgse-0.12.0}/mkdocs.yml +0 -0
  491. {cgse-0.11.4 → cgse-0.12.0}/overrides/.icons/custom/dbend-dark.svg +0 -0
  492. {cgse-0.11.4 → cgse-0.12.0}/overrides/.icons/custom/dbend-light.svg +0 -0
  493. {cgse-0.11.4 → cgse-0.12.0}/overrides/.icons/custom/gear.svg +0 -0
  494. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/cgse-tools/README.md +0 -0
  495. {cgse-0.11.4/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol → cgse-0.12.0/projects/generic/cgse-tools/src/cgse_tools}/__init__.py +0 -0
  496. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/README.md +0 -0
  497. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/justfile +0 -0
  498. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/noxfile.py +0 -0
  499. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/service_registry.db +0 -0
  500. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/__init__.py +0 -0
  501. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.py +0 -0
  502. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/egse/tempcontrol/keithley/daq6510.yaml +0 -0
  503. {cgse-0.11.4/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol → cgse-0.12.0/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol}/__init__.py +0 -0
  504. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/src/keithley_tempcontrol/settings.yaml +0 -0
  505. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/keithley-tempcontrol/temperature_readings.log +0 -0
  506. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/README.md +0 -0
  507. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/egse/tempcontrol/lakeshore/lakeshore336.yaml +0 -0
  508. {cgse-0.11.4/projects/generic/symetrie-hexapod/src/symetrie_hexapod → cgse-0.12.0/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol}/__init__.py +0 -0
  509. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/lakeshore-tempcontrol/src/lakeshore_tempcontrol/settings.yaml +0 -0
  510. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/README.md +0 -0
  511. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/joran.yaml +0 -0
  512. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/puna.yaml +0 -0
  513. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/egse/hexapod/symetrie/zonda.yaml +0 -0
  514. /cgse-0.11.4/projects/plato/plato-hdf5/README.md → /cgse-0.12.0/projects/generic/symetrie-hexapod/src/symetrie_hexapod/__init__.py +0 -0
  515. {cgse-0.11.4 → cgse-0.12.0}/projects/generic/symetrie-hexapod/src/symetrie_hexapod/settings.yaml +0 -0
  516. {cgse-0.11.4 → cgse-0.12.0}/projects/plato/plato-fits/README.md +0 -0
  517. {cgse-0.11.4/projects/plato/plato-spw → cgse-0.12.0/projects/plato/plato-hdf5}/README.md +0 -0
  518. {cgse-0.11.4 → cgse-0.12.0}/ruff.toml +0 -0
  519. {cgse-0.11.4 → cgse-0.12.0}/test_service_registry.db +0 -0
@@ -0,0 +1,19 @@
1
+ name: Ruff Formatting Check
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize, reopened]
6
+
7
+ jobs:
8
+ ruff-format:
9
+ name: Run ruff format for the whole project
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - name: Checkout code
14
+ uses: actions/checkout@v4
15
+
16
+ - name: Ruff Format Check
17
+ uses: astral-sh/ruff-action@v3
18
+ with:
19
+ args: format --check --diff .
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cgse
3
- Version: 0.11.4
3
+ Version: 0.12.0
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>
7
7
  License: MIT
8
- Requires-Python: >=3.9
8
+ Requires-Python: >=3.10
9
9
  Requires-Dist: cgse-common
10
10
  Requires-Dist: cgse-core
11
11
  Requires-Dist: cgse-tools
@@ -0,0 +1,111 @@
1
+ import psutil
2
+ import time
3
+ from dataclasses import dataclass
4
+ from typing import List, Dict
5
+ import json
6
+
7
+
8
+ @dataclass
9
+ class ProcessInfo:
10
+ pid: int
11
+ name: str
12
+ username: str
13
+ cpu_percent: float
14
+ memory_percent: float
15
+ memory_mb: float
16
+ status: str
17
+ create_time: float
18
+ command: str
19
+
20
+ def to_dict(self):
21
+ return {
22
+ "pid": self.pid,
23
+ "name": self.name,
24
+ "username": self.username,
25
+ "cpu_percent": self.cpu_percent,
26
+ "memory_percent": self.memory_percent,
27
+ "memory_mb": self.memory_mb,
28
+ "status": self.status,
29
+ "create_time": self.create_time,
30
+ "command": self.command,
31
+ }
32
+
33
+
34
+ class ProcessMonitor:
35
+ def __init__(self):
36
+ self.previous_cpu = {}
37
+
38
+ def get_processes(self, filter_func=None) -> List[ProcessInfo]:
39
+ """Get current processes with optional filtering"""
40
+ processes = []
41
+
42
+ for proc in psutil.process_iter():
43
+ try:
44
+ with proc.oneshot(): # Efficient way to get multiple attributes
45
+ info = ProcessInfo(
46
+ pid=proc.pid,
47
+ name=proc.name(),
48
+ username=proc.username(),
49
+ cpu_percent=proc.cpu_percent(),
50
+ memory_percent=proc.memory_percent(),
51
+ memory_mb=proc.memory_info().rss / 1024 / 1024,
52
+ status=proc.status(),
53
+ create_time=proc.create_time(),
54
+ command=" ".join(proc.cmdline()) if proc.cmdline() else proc.name(),
55
+ )
56
+
57
+ if filter_func is None or filter_func(info):
58
+ processes.append(info)
59
+
60
+ except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
61
+ continue
62
+
63
+ return processes
64
+
65
+ def find_by_name(self, name: str) -> List[ProcessInfo]:
66
+ """Find processes by name"""
67
+ return self.get_processes(lambda p: name.lower() in p.name.lower())
68
+
69
+ def find_high_cpu(self, threshold: float = 5.0) -> List[ProcessInfo]:
70
+ """Find processes using high CPU"""
71
+ return self.get_processes(lambda p: p.cpu_percent > threshold)
72
+
73
+ def find_high_memory(self, threshold_mb: float = 100.0) -> List[ProcessInfo]:
74
+ """Find processes using high memory"""
75
+ return self.get_processes(lambda p: p.memory_mb > threshold_mb)
76
+
77
+ def kill_process(self, pid: int, force: bool = False):
78
+ """Safely kill a process"""
79
+ try:
80
+ proc = psutil.Process(pid)
81
+ if force:
82
+ proc.kill()
83
+ else:
84
+ proc.terminate()
85
+ return True
86
+ except (psutil.NoSuchProcess, psutil.AccessDenied):
87
+ return False
88
+
89
+ def export_to_json(self, filename: str):
90
+ """Export current process list to JSON"""
91
+ processes = [p.to_dict() for p in self.get_processes()]
92
+ with open(filename, "w") as f:
93
+ json.dump(processes, f, indent=2)
94
+
95
+
96
+ # Usage examples
97
+ monitor = ProcessMonitor()
98
+
99
+ # Find all Python processes
100
+ python_procs = monitor.find_by_name("python")
101
+ print(f"Found {len(python_procs)} Python processes")
102
+ for proc in python_procs:
103
+ print(f"{proc.name} ({proc.pid} – {proc.cpu_percent}%)")
104
+
105
+ # Find high CPU usage
106
+ high_cpu = monitor.find_high_cpu(10.0)
107
+ for proc in high_cpu:
108
+ print(f"High CPU: {proc.name} (PID: {proc.pid}) - {proc.cpu_percent}%")
109
+
110
+ # Export current state
111
+ monitor.export_to_json("processes.json")
@@ -16,7 +16,7 @@ Note:
16
16
  """
17
17
 
18
18
  # /// script
19
- # requires-python = ">=3.9"
19
+ # requires-python = ">=3.10"
20
20
  # dependencies = [
21
21
  # "tomlkit",
22
22
  # "rich",
@@ -33,17 +33,17 @@ import tomlkit.exceptions
33
33
  import typer
34
34
 
35
35
 
36
- def bump_version(version, part='patch'):
37
- major, minor, patch = map(int, version.split('.'))
36
+ def bump_version(version, part="patch"):
37
+ major, minor, patch = map(int, version.split("."))
38
38
 
39
- if part == 'major':
39
+ if part == "major":
40
40
  major += 1
41
41
  minor = 0
42
42
  patch = 0
43
- elif part == 'minor':
43
+ elif part == "minor":
44
44
  minor += 1
45
45
  patch = 0
46
- elif part == 'patch':
46
+ elif part == "patch":
47
47
  patch += 1
48
48
  else:
49
49
  raise ValueError("Part must be 'major', 'minor', or 'patch'")
@@ -77,7 +77,7 @@ def update_project_version(project_dir, new_version):
77
77
  tomlkit.dump(data, file)
78
78
 
79
79
  except tomlkit.exceptions.NonExistentKey:
80
- rich.print(f"[red]\[project.version] is not defined in pyproject.toml in {project_dir}[/]")
80
+ rich.print(rf"[red]\[project.version] is not defined in pyproject.toml in {project_dir}[/]")
81
81
 
82
82
 
83
83
  def update_all_projects_in_monorepo(root_dir: pathlib.Path, part: str, dry_run: bool = False, verbose: bool = True):
@@ -117,7 +117,6 @@ app = typer.Typer()
117
117
 
118
118
  @app.command()
119
119
  def main(part: str, dry_run: bool = False, verbose: bool = True):
120
-
121
120
  monorepo_root = pathlib.Path(__file__).parent.resolve()
122
121
 
123
122
  cwd = os.getcwd()
@@ -0,0 +1,261 @@
1
+ # Monitoring with InfluxDB and Grafana
2
+
3
+ The CGSE provides mechanisms to monitor metrics from different processes and devices. These are
4
+ collected by InfluxDB and are visualised by means of Grafana dashboards.
5
+
6
+ In this section, we explain how to install both InfluxDB and Grafana on the Server, how to set up and populate a database
7
+ in InfluxDB, and how to visualise the metrics in Grafana dashboards.
8
+
9
+
10
+ ---
11
+
12
+ ## Installation
13
+
14
+ ### InfluxDB3 Core
15
+
16
+ To install InfluxDB3 Core, execute this in a Terminal on the Server:
17
+
18
+ ```
19
+ curl -s https://repos.influxdata.com/influxdata-archive_compat.key > influxdata-archive_compat.key
20
+
21
+ echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
22
+ echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list
23
+
24
+ sudo apt-get update
25
+
26
+ sudo apt-get install influxdb3-core
27
+ ```
28
+
29
+ For database management, you will need a token to interact with InfluxDB. This can be generated as follows (in a
30
+ Terminal on the Server):
31
+
32
+ ```
33
+ influxdb3 create token --admin
34
+ ```
35
+
36
+ This will print out a token, starting with `apiv3_`. Export this value as environment variable `INFLUXDB3_AUTH_TOKEN`.
37
+
38
+
39
+ ### Grafana
40
+
41
+ To install Grafana, execute this in a Terminal on the Server:
42
+
43
+ ```
44
+ sudo apt-get install -y apt-transport-https software-properties-common wget
45
+
46
+ sudo mkdir -p /etc/apt/keyrings/
47
+ wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
48
+
49
+ echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
50
+ sudo apt-get update
51
+
52
+ sudo apt-get install grafana
53
+
54
+ sudo /bin/systemctl daemon-reload
55
+ sudo /bin/systemctl enable grafana-server
56
+ ```
57
+
58
+ ---
59
+
60
+ ## Database Structure
61
+
62
+ ### Database Name
63
+
64
+ In the current implementation, the name of the database in which all CGSE metrics are stored, is taken
65
+ from the `PROJECT` environment variable. At a later stage, we could change this by means of a dedicated
66
+ environment variable or by specifying it in the local settings file.
67
+
68
+ To inspect the names of the available databases, execute this in a Terminal on the Server:
69
+
70
+ ```
71
+ influxdb3 show databases
72
+ ```
73
+
74
+ The command to create a database manually (from a Terminal on the Server) is:
75
+
76
+ ```
77
+ influxdb3 create database <database name>
78
+ ```
79
+
80
+ ### Table Names
81
+
82
+ For each of the processes, we have a dedicated table in the database, the name of which is the same as
83
+ the storage mnemonic of the process.
84
+
85
+ To get an overview of the available tables, execute this in a Terminal on the Server:
86
+
87
+ ```
88
+ influxdb3 query --database <database name> "SHOW TABLES"
89
+ ```
90
+
91
+ ### Content of the Tables
92
+
93
+ For each table, the column names are the names of the corresponding housekeeping/metrics parameters. The name of the column with the timestamp is `TIME`.
94
+
95
+ To get an overview of the columns for a given table in a given database, execute this in a Terminal on the Server:
96
+
97
+ ```
98
+ influxdb3 query --database <database name> "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table name>'"
99
+ ```
100
+
101
+ To get an overview of the data stored in a given table (sorted by ascending order of timestamp), execute this in a
102
+ Terminal on the Server:
103
+
104
+ ```
105
+ influxdb3 query --database <database name> "SELECT * FROM <table name> ORDER BY TIME"
106
+ ```
107
+
108
+ ---
109
+
110
+ ## Propagating Metrics to InfluxDB via Python
111
+
112
+ To populate the metrics in InfluxDB, we use the Python package `influxdb3-python`. This has been added to the `pyproject.toml`
113
+ file of the `cgse-common` module.
114
+
115
+ When implementing a new device, nothing has to be done specifically to propagate the metrics to InfluxDB. This is
116
+ automatically being taken care of in the `serve` method of the `ControlServer` class. In the section where the
117
+ housekeeping information is written to a dedicated CSV file, the `propagate_metrics` method of the `ControlServer`
118
+ class is called and this takes care of everything.
119
+
120
+
121
+
122
+ [//]: # (### Establishing a Connection)
123
+
124
+ [//]: # ()
125
+ [//]: # (In the initialisation a the `CommandProtocol`, an `influxdb_client_3.InfluxDBClient3` is created &#40;and stored in )
126
+
127
+ [//]: # (`self.client`&#41;, which establishes a connection to InfluxDB. This is also where the write precision for the )
128
+
129
+ [//]: # (timestamp is specified. Note that - to establish this connection - both the `PROJECT` and `INFLUXDB3_AUTH_TOKEN` )
130
+
131
+ [//]: # (environment variables have to be set. If this is not the case, `self.client` will be `None`. )
132
+
133
+ [//]: # ()
134
+ [//]: # (Note that when the InfluxDB process is &#40;re-&#41;started, the individual processes pick up on this automatically &#40;so you )
135
+
136
+ [//]: # (don't have to do anything extra for the metrics to start appearing in the database again&#41;.)
137
+
138
+ [//]: # ()
139
+ [//]: # (### Device Protocols)
140
+
141
+ [//]: # ()
142
+ [//]: # (In the implementing protocols, in the `get_housekeeping` method, we have to propagate the metrics to InfluxDB. Usually )
143
+
144
+ [//]: # (we have an `hk` dictionary &#40;or something alike&#41; with the housekeeping information that will be stored in a dedicated CSV file. This dictionary )
145
+
146
+ [//]: # (also contains the timestamp for all parameters. This is the return value of the `get_housekeeping` method.)
147
+
148
+ [//]: # ()
149
+ [//]: # (To propagate these housekeeping parameters as metrics to InfluxDB, you have to construct a dictionary &#40;see further for the required content&#41;, )
150
+
151
+ [//]: # (say `metrics_dictionary`, which we will write to InfluxDB, as follows &#40;in the `get_housekeeping` method&#41;:)
152
+
153
+ [//]: # ()
154
+ [//]: # (``` python )
155
+
156
+ [//]: # (try:)
157
+
158
+ [//]: # ( if self.client:)
159
+
160
+ [//]: # ( metrics_dictionary = {...})
161
+
162
+ [//]: # ( point = Point.from_dict&#40;metrics_dictionary, write_precision=self.metrics_time_precision&#41;)
163
+
164
+ [//]: # ( self.client.write&#40;point&#41;)
165
+
166
+ [//]: # ( except NewConnectionError:)
167
+
168
+ [//]: # ( pass)
169
+
170
+ [//]: # (```)
171
+
172
+ [//]: # ()
173
+ [//]: # (This requires the following imports:)
174
+
175
+ [//]: # ()
176
+ [//]: # (``` python)
177
+
178
+ [//]: # (from influxdb_client_3 import Point)
179
+
180
+ [//]: # (from urllib3.exceptions import NewConnectionError)
181
+
182
+ [//]: # (```)
183
+
184
+ [//]: # ()
185
+ [//]: # (#### Metrics Dictionary )
186
+
187
+ [//]: # ()
188
+ [//]: # (The `metrics_dictionary` has the following structure:)
189
+
190
+ [//]: # ()
191
+ [//]: # (- `measurement`: Storage mnemonic of the process, which will be used as table name in the database;)
192
+
193
+ [//]: # (- `tags`: Dictionary with tags for the table in the database. At this point, its function is not entirely clear yet. We are using the following tags:)
194
+
195
+ [//]: # ( - `site_id`: Site identifier, as taken from the settings/setup &#40;e.g. "KUL", "CSL",...&#41;;)
196
+
197
+ [//]: # ( - `origin`: Storage mnemonic of the process;)
198
+
199
+ [//]: # (- `fields`: Dictionary with metrics. This is the same as the `hk` dictionary but without the timestamp;)
200
+
201
+ [//]: # (- `time`: Timestamp as taken from the `hk` dictionary.)
202
+
203
+ [//]: # ()
204
+ [//]: # (### Closing the Connection)
205
+
206
+ [//]: # ()
207
+ [//]: # (In the `quit` method of the device protocol, do not forget to close the connection to InfluxDB, by adding this line:)
208
+
209
+ [//]: # ()
210
+ [//]: # (``` python)
211
+
212
+ [//]: # (if self.client:)
213
+
214
+ [//]: # ( self.client.close&#40;&#41;)
215
+
216
+ [//]: # (```)
217
+
218
+ ---
219
+
220
+ ## Visualisation of the Metrics
221
+
222
+ The Metrics are visualised in Grafana dashboards, but before we can start building those, we have to instruct Grafana to
223
+ interpret InfluxDB as its data source.
224
+
225
+ ### Adding InfluxDB as Data Source
226
+
227
+ After the InfluxDB and Grafana processes have been started, you can access Grafana in your browser via http://localhost:3000.
228
+
229
+ On the left-hand side, select (under "Connections") "Add new connection" and search for "Influx DB". After clicking on
230
+ the search result, a Settings tab will open, in which you have to enter the following information:
231
+
232
+ - `Name`: Arbitrary name for the data source (it's a good idea to make this reflect the database you are settings up, e.g. `influxdb3-ariel`);
233
+ - `Query language`: Select "SQL";
234
+ - `HTTP` > `URL`: `http://127.0.0.1:8181`;
235
+ - `Auth`: Only enable "Basic auth";
236
+ - `InfluxDB Details` > `Database`: Name of the database for which you want to create Grafana dashboards;
237
+ - `InfluxDB Details` > `Token`: InfluxDB token you have created earlier (see above; starting with `apiv3_`);
238
+ - `InfluxDB Details`: Enable "Insecure Connection".
239
+
240
+ After having configured all of this, press "Save & test".
241
+
242
+ ### Creating Grafana Dashboards
243
+
244
+ Creating a Grafana dashboard can be done by clicking "Dashboards" on the left-hand side. In the "Queries" tab of such a
245
+ dashboard panel, you have to specify the following information:
246
+
247
+ - `Data source`: Name of the data source you have just created (selectable via a drop-down menu);
248
+ - `Table`: Name of the table for which you want to visualise metrics. Remember that this is the same as the storage
249
+ mnemonic of the process generating the metrics (selectable via a drop-down menu);
250
+ - `Data operations`: Besides the name of the metric (selectable via a drop-down menu), you also have to add `time` under
251
+ `Data Operations`, to make sure Grafana recognises and is able to show the timestamp in its panels.
252
+ Have a look at the screenshot below for an example.
253
+ ![grafana-queries.png](../images/grafana-queries.png)
254
+ ---
255
+
256
+ ## Open Questions
257
+
258
+ - How can we specify the data retention period?
259
+ - Is it ok to use the `PROJECT` environment variable as name of the database or should this be configurable (e.g. via
260
+ the local settings, an extra environment variable)?
261
+ - Is ms the desired write precision of the timestamp? Should this be configurable (via the local settings)?
@@ -44,12 +44,11 @@ A microservice can register as follows:
44
44
  from egse.registry.client import AsyncRegistryClient
45
45
 
46
46
  registry_client = AsyncRegistryClient()
47
- registry_client.connect()
48
47
 
49
48
  service_id = await registry_client.register(
50
49
  name=service_name,
51
- host=hostname,
52
- port=port_number,
50
+ host=get_host_ip(),
51
+ port=get_port(),
53
52
  service_type=service_type,
54
53
  metadata={},
55
54
  ttl=30,
@@ -1,6 +1,6 @@
1
1
  import nox
2
2
 
3
- python_versions = ['3.9', '3.10', '3.11', '3.12', '3.13']
3
+ python_versions = ["3.9", "3.10", "3.11", "3.12", "3.13"]
4
4
 
5
5
 
6
6
  @nox.session(python=python_versions)
@@ -20,7 +20,7 @@ def uv_tests(session: nox.Session):
20
20
  session.run_install("uv", "venv", *py_version)
21
21
 
22
22
  session.run_install(
23
- *uv_sync_cmd, # "--all-packages",
23
+ *uv_sync_cmd, # "--all-packages",
24
24
  env={"UV_PROJECT_ENVIRONMENT": session.virtualenv.location},
25
25
  )
26
26
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cgse-common"
3
- version = "0.11.4"
3
+ version = "0.12.0"
4
4
  description = "Software framework to support hardware testing"
5
5
  authors = [
6
6
  {name = "IvS KU Leuven"}
@@ -10,7 +10,7 @@ maintainers = [
10
10
  {name = "Sara Regibo", email = "sara.regibo@kuleuven.be"}
11
11
  ]
12
12
  readme = {"file" = "README.md", "content-type" = "text/markdown"}
13
- requires-python = ">=3.9"
13
+ requires-python = ">=3.10"
14
14
  license = "MIT"
15
15
  keywords = [
16
16
  "CGSE",
@@ -4,4 +4,5 @@ from dataclasses import dataclass
4
4
  @dataclass
5
5
  class AppState:
6
6
  """Global Typer app parameters."""
7
+
7
8
  verbose: bool = False
@@ -19,6 +19,7 @@ the group name 'cgse.command.plugins'.
19
19
  Commands can be added as single commands or as a group containing further sub-commands. To add a group,
20
20
  the entry point shall contain 'group' in its extras.
21
21
  """
22
+
22
23
  import textwrap
23
24
 
24
25
  import rich
@@ -57,6 +58,7 @@ def broken_command(name: str, module: str, exc: Exception):
57
58
 
58
59
  # Load the known plugins for the `cgse` command. Plugins are added as commands to the `cgse`.
59
60
 
61
+
60
62
  class SortedCommandGroup(TyperGroup):
61
63
  """This class sorts the commands based on the following criteria:
62
64
 
@@ -64,6 +66,7 @@ class SortedCommandGroup(TyperGroup):
64
66
  - the rest of the commands are sorted alphabetically
65
67
 
66
68
  """
69
+
67
70
  def list_commands(self, ctx):
68
71
  # Get list of all commands
69
72
  commands = super().list_commands(ctx)
@@ -141,17 +144,14 @@ def build_app():
141
144
  if group == "cgse.service":
142
145
  app.add_typer(ep.load(), name=ep.name)
143
146
  else:
144
- command_group = snake_to_title(group.split('.')[-1])
147
+ command_group = snake_to_title(group.split(".")[-1])
145
148
  app.add_typer(ep.load(), name=ep.name, rich_help_panel=command_group)
146
149
  except Exception as exc:
147
150
  app.command()(broken_command(ep.name, ep.module, exc))
148
151
 
149
152
 
150
153
  @app.callback(no_args_is_help=True, invoke_without_command=True)
151
- def main(
152
- ctx: typer.Context,
153
- verbose: bool = False
154
- ):
154
+ def main(ctx: typer.Context, verbose: bool = False):
155
155
  """
156
156
  The `cgse` command is used to:
157
157
 
@@ -28,9 +28,11 @@ try:
28
28
  # This function is only available when the cgse-core package is installed
29
29
  from egse.logger import close_all_zmq_handlers
30
30
  except ImportError:
31
+
31
32
  def close_all_zmq_handlers(): # noqa
32
33
  pass
33
34
 
35
+
34
36
  from egse.process import ProcessStatus
35
37
  from egse.settings import Settings
36
38
  from egse.system import get_average_execution_time
@@ -390,7 +392,7 @@ class ControlServer(abc.ABC):
390
392
  if condition and not condition():
391
393
  self.logger.debug(
392
394
  f"Task {task_name} rescheduled in {self.scheduled_task_delay}s, condition not met...."
393
- )
395
+ )
394
396
  self.logger.info(f"Task {task_name} rescheduled in {self.scheduled_task_delay}s")
395
397
  current_time = datetime.datetime.now(tz=datetime.timezone.utc)
396
398
  scheduled_time = current_time + datetime.timedelta(seconds=self.scheduled_task_delay)
@@ -621,7 +623,7 @@ class ControlServer(abc.ABC):
621
623
  if not self.device_protocol.is_alive():
622
624
  self.logger.error(
623
625
  "Some Thread or sub-process that was started by Protocol has died, terminating..."
624
- )
626
+ )
625
627
  self.quit()
626
628
  break
627
629
  except asyncio.CancelledError:
@@ -698,7 +700,7 @@ class ControlServer(abc.ABC):
698
700
  asyncio.create_task(self.process_scheduled_tasks()),
699
701
  asyncio.create_task(self.update_metrics()),
700
702
  asyncio.create_task(self.check_device_protocol_alive()),
701
- asyncio.create_task(self.process_sequential_queue()) # Add sequential queue processor
703
+ asyncio.create_task(self.process_sequential_queue()), # Add sequential queue processor
702
704
  ]
703
705
 
704
706
  # Add housekeeping task if storage manager is active
@@ -90,6 +90,7 @@ Do we need additional hooks into this commanding?
90
90
  * provide an execute method for the CommandExecution that executes the command
91
91
  with the saved parameters
92
92
  """
93
+
93
94
  from __future__ import annotations
94
95
 
95
96
  import functools
@@ -618,8 +619,7 @@ def get_function(parent_class: type, method_name: str) -> Callable:
618
619
 
619
620
 
620
621
  def load_commands(
621
- protocol_class: type[CommandProtocol], command_settings: dict, command_class: type[Command],
622
- device_class: type
622
+ protocol_class: type[CommandProtocol], command_settings: dict, command_class: type[Command], device_class: type
623
623
  ) -> dict[str, Command]:
624
624
  """
625
625
  Loads the command definitions from the given ``command_settings`` and builds an internal