runtimepy 5.14.2__tar.gz → 5.15.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 (333) hide show
  1. {runtimepy-5.14.2/runtimepy.egg-info → runtimepy-5.15.0}/PKG-INFO +6 -6
  2. {runtimepy-5.14.2 → runtimepy-5.15.0}/README.md +2 -2
  3. {runtimepy-5.14.2 → runtimepy-5.15.0}/pyproject.toml +1 -1
  4. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/__init__.py +2 -2
  5. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/__init__.py +1 -4
  6. runtimepy-5.15.0/runtimepy/channel/environment/__init__.py +149 -0
  7. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/environment/create.py +16 -1
  8. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/environment/sample.py +10 -2
  9. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/registry.py +2 -3
  10. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/codec/protocol/base.py +34 -14
  11. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/codec/protocol/json.py +5 -3
  12. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/codec/system/__init__.py +6 -2
  13. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/control/source.py +1 -1
  14. runtimepy-5.15.0/runtimepy/data/404.md +16 -0
  15. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/base.yaml +3 -0
  16. runtimepy-5.15.0/runtimepy/data/css/bootstrap_extra.css +127 -0
  17. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/css/main.css +23 -4
  18. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/dummy_load.yaml +2 -2
  19. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/factories.yaml +1 -0
  20. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/App.js +54 -2
  21. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/ChannelTable.js +6 -8
  22. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/Plot.js +9 -4
  23. runtimepy-5.15.0/runtimepy/data/js/classes/TabFilter.js +86 -0
  24. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/TabInterface.js +106 -11
  25. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/WindowHashManager.js +30 -15
  26. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/init.js +18 -1
  27. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/markdown_page.js +10 -0
  28. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/BitFields.yaml +9 -0
  29. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/RuntimeEnum.yaml +6 -0
  30. runtimepy-5.15.0/runtimepy/data/schemas/StructConfig.yaml +13 -0
  31. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/css/bootstrap-icons.min.css +4 -3
  32. runtimepy-5.15.0/runtimepy/data/static/css/bootstrap.min.css +5 -0
  33. runtimepy-5.15.0/runtimepy/data/static/css/fonts/bootstrap-icons.woff +0 -0
  34. runtimepy-5.15.0/runtimepy/data/static/css/fonts/bootstrap-icons.woff2 +0 -0
  35. runtimepy-5.15.0/runtimepy/data/static/js/bootstrap.bundle.min.js +8 -0
  36. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/js/webglplot.umd.min.js +2 -1
  37. runtimepy-5.15.0/runtimepy/data/static/svg/outline-dark.svg +22 -0
  38. runtimepy-5.15.0/runtimepy/data/static/svg/outline-light.svg +22 -0
  39. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/enum/__init__.py +13 -1
  40. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/enum/registry.py +13 -1
  41. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/message/__init__.py +3 -3
  42. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/mixins/logging.py +6 -1
  43. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/__init__.py +0 -2
  44. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/info.py +36 -4
  45. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/struct/__init__.py +3 -2
  46. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/connection.py +4 -5
  47. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/html/__init__.py +29 -11
  48. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/html/bootstrap/__init__.py +2 -2
  49. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/html/bootstrap/elements.py +44 -24
  50. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/html/bootstrap/tabs.py +18 -11
  51. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/http/__init__.py +3 -3
  52. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/http/request_target.py +3 -3
  53. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/mixin.py +4 -2
  54. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/__init__.py +16 -9
  55. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/__init__.py +1 -0
  56. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/create.py +3 -3
  57. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/env/__init__.py +28 -4
  58. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/env/settings.py +4 -7
  59. runtimepy-5.15.0/runtimepy/net/server/app/env/tab/controls.py +271 -0
  60. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/env/tab/html.py +68 -26
  61. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/env/widgets.py +115 -61
  62. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/landing_page.py +1 -1
  63. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/html.py +2 -2
  64. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/json.py +1 -1
  65. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/markdown.py +18 -12
  66. runtimepy-5.15.0/runtimepy/net/server/mux.py +29 -0
  67. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/stream/__init__.py +6 -5
  68. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/stream/base.py +4 -2
  69. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/tcp/connection.py +5 -3
  70. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/tcp/http/__init__.py +10 -9
  71. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/tcp/protocol.py +2 -2
  72. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/tcp/scpi/__init__.py +5 -2
  73. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/tcp/telnet/__init__.py +2 -1
  74. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/udp/connection.py +10 -6
  75. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/udp/protocol.py +5 -6
  76. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/udp/queue.py +5 -2
  77. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/udp/tftp/base.py +2 -1
  78. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/websocket/connection.py +50 -8
  79. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/array/__init__.py +7 -5
  80. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/base.py +3 -2
  81. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/field/__init__.py +35 -2
  82. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/field/fields.py +11 -2
  83. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/field/manager/base.py +19 -2
  84. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/serializable/base.py +5 -2
  85. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/serializable/fixed.py +5 -2
  86. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/serializable/prefixed.py +4 -1
  87. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/types/base.py +4 -1
  88. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/types/bounds.py +10 -4
  89. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/registry/__init__.py +20 -0
  90. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/registry/name.py +6 -0
  91. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/requirements.txt +2 -2
  92. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/ui/controls.py +20 -1
  93. {runtimepy-5.14.2 → runtimepy-5.15.0/runtimepy.egg-info}/PKG-INFO +6 -6
  94. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy.egg-info/SOURCES.txt +4 -1
  95. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy.egg-info/requires.txt +3 -3
  96. runtimepy-5.14.2/runtimepy/channel/environment/__init__.py +0 -58
  97. runtimepy-5.14.2/runtimepy/data/404.html +0 -7
  98. runtimepy-5.14.2/runtimepy/data/css/bootstrap_extra.css +0 -112
  99. runtimepy-5.14.2/runtimepy/data/js/classes/TabFilter.js +0 -48
  100. runtimepy-5.14.2/runtimepy/data/schemas/StructConfig.yaml +0 -5
  101. runtimepy-5.14.2/runtimepy/data/static/css/bootstrap.min.css +0 -6
  102. runtimepy-5.14.2/runtimepy/data/static/css/fonts/bootstrap-icons.woff +0 -0
  103. runtimepy-5.14.2/runtimepy/data/static/css/fonts/bootstrap-icons.woff2 +0 -0
  104. runtimepy-5.14.2/runtimepy/data/static/js/bootstrap.bundle.min.js +0 -7
  105. runtimepy-5.14.2/runtimepy/net/server/app/env/tab/controls.py +0 -157
  106. {runtimepy-5.14.2 → runtimepy-5.15.0}/LICENSE +0 -0
  107. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/__main__.py +0 -0
  108. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/app.py +0 -0
  109. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/environment/array.py +0 -0
  110. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/environment/base.py +0 -0
  111. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/environment/command/__init__.py +0 -0
  112. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/environment/command/parser.py +0 -0
  113. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/environment/command/processor.py +0 -0
  114. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/environment/command/result.py +0 -0
  115. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/environment/file.py +0 -0
  116. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/environment/telemetry.py +0 -0
  117. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/event/__init__.py +0 -0
  118. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/channel/event/header.py +0 -0
  119. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/codec/__init__.py +0 -0
  120. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/codec/protocol/__init__.py +0 -0
  121. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/codec/protocol/receiver.py +0 -0
  122. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/commands/__init__.py +0 -0
  123. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/commands/all.py +0 -0
  124. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/commands/arbiter.py +0 -0
  125. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/commands/common.py +0 -0
  126. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/commands/mtu.py +0 -0
  127. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/commands/server.py +0 -0
  128. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/commands/task.py +0 -0
  129. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/commands/tftp.py +0 -0
  130. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/commands/tui.py +0 -0
  131. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/control/__init__.py +0 -0
  132. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/control/env/__init__.py +0 -0
  133. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/control/step.py +0 -0
  134. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/browser.yaml +0 -0
  135. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/css/font.css +0 -0
  136. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/favicon.ico +0 -0
  137. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/DataConnection.js +0 -0
  138. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/JsonConnection.js +0 -0
  139. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/audio.js +0 -0
  140. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/DataConnection.js +0 -0
  141. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/JsonConnection.js +0 -0
  142. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/OverlayManager.js +0 -0
  143. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/PlotDrawer.js +0 -0
  144. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/PlotManager.js +0 -0
  145. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/PlotModalManager.js +0 -0
  146. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/PointBuffer.js +0 -0
  147. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/PointManager.js +0 -0
  148. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/UnitSystem.js +0 -0
  149. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/classes/WorkerInterface.js +0 -0
  150. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/events.js +0 -0
  151. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/main.js +0 -0
  152. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/tab/env.js +0 -0
  153. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/tab/sound.js +0 -0
  154. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/third-party/webgl-debug.js +0 -0
  155. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/unused/pyodide.js +0 -0
  156. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/util.js +0 -0
  157. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/js/worker.js +0 -0
  158. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/md/Connection.md +0 -0
  159. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/md/PeriodicTask.md +0 -0
  160. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/md/RuntimeStruct.md +0 -0
  161. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/md/RuntimepyPeer.md +0 -0
  162. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/md/SinusoidTask.md +0 -0
  163. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/sample_telemetry.yaml +0 -0
  164. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/Channel.yaml +0 -0
  165. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/ChannelCommand.yaml +0 -0
  166. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/ChannelRegistry.yaml +0 -0
  167. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/ClientConnectionConfig.yaml +0 -0
  168. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/ConnectionArbiterConfig.yaml +0 -0
  169. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/EnumRegistry.yaml +0 -0
  170. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/FindFile.yaml +0 -0
  171. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/PeerProcessConfig.yaml +0 -0
  172. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/ServerConnectionConfig.yaml +0 -0
  173. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/TaskConfig.yaml +0 -0
  174. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/channel_controls.yaml +0 -0
  175. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/has_config.yaml +0 -0
  176. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/has_factory.yaml +0 -0
  177. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/has_markdown.yaml +0 -0
  178. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/has_name.yaml +0 -0
  179. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/schemas/has_request_flag.yaml +0 -0
  180. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/server.yaml +0 -0
  181. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/server_base.yaml +0 -0
  182. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/server_dev.yaml +0 -0
  183. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/png/chip-circle-bootstrap/1024x1024.png +0 -0
  184. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/png/chip-circle-bootstrap/128x128.png +0 -0
  185. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/png/chip-circle-bootstrap/16x16.png +0 -0
  186. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/png/chip-circle-bootstrap/1920x1920.png +0 -0
  187. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/png/chip-circle-bootstrap/24x24.png +0 -0
  188. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/png/chip-circle-bootstrap/256x256.png +0 -0
  189. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/png/chip-circle-bootstrap/32x32.png +0 -0
  190. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/png/chip-circle-bootstrap/512x512.png +0 -0
  191. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/png/chip-circle-bootstrap/64x64.png +0 -0
  192. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/svg/chip-circle-bootstrap.svg +0 -0
  193. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/woff2/CascadiaCode-Bold.woff2 +0 -0
  194. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/woff2/CascadiaCode-BoldItalic.woff2 +0 -0
  195. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/woff2/CascadiaCode-Italic.woff2 +0 -0
  196. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/woff2/CascadiaCode-Regular.woff2 +0 -0
  197. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/woff2/CascadiaMono-Bold.woff2 +0 -0
  198. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/woff2/CascadiaMono-BoldItalic.woff2 +0 -0
  199. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/woff2/CascadiaMono-Italic.woff2 +0 -0
  200. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/woff2/CascadiaMono-Regular.woff2 +0 -0
  201. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/static/woff2/README.md +0 -0
  202. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/data/tftp_server.yaml +0 -0
  203. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/dev_requirements.txt +0 -0
  204. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/entry.py +0 -0
  205. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/enum/types.py +0 -0
  206. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/mapping.py +0 -0
  207. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/message/handlers.py +0 -0
  208. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/message/interface.py +0 -0
  209. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/message/types.py +0 -0
  210. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/metrics/__init__.py +0 -0
  211. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/metrics/channel.py +0 -0
  212. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/metrics/connection.py +0 -0
  213. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/metrics/task.py +0 -0
  214. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/mixins/__init__.py +0 -0
  215. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/mixins/async_command.py +0 -0
  216. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/mixins/enum.py +0 -0
  217. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/mixins/environment.py +0 -0
  218. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/mixins/finalize.py +0 -0
  219. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/mixins/psutil.py +0 -0
  220. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/mixins/regex.py +0 -0
  221. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/mixins/trig.py +0 -0
  222. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/apps/__init__.py +0 -0
  223. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/__init__.py +0 -0
  224. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/base.py +0 -0
  225. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/config/__init__.py +0 -0
  226. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/config/codec.py +0 -0
  227. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/config/util.py +0 -0
  228. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/factory/__init__.py +0 -0
  229. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/factory/connection.py +0 -0
  230. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/factory/task.py +0 -0
  231. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/housekeeping/__init__.py +0 -0
  232. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/imports/__init__.py +0 -0
  233. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/imports/util.py +0 -0
  234. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/result.py +0 -0
  235. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/task.py +0 -0
  236. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/tcp/__init__.py +0 -0
  237. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/tcp/json.py +0 -0
  238. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/udp.py +0 -0
  239. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/arbiter/websocket.py +0 -0
  240. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/backoff.py +0 -0
  241. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/factories/__init__.py +0 -0
  242. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/html/arbiter.py +0 -0
  243. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/http/common.py +0 -0
  244. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/http/header.py +0 -0
  245. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/http/response.py +0 -0
  246. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/http/state.py +0 -0
  247. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/http/version.py +0 -0
  248. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/manager.py +0 -0
  249. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/mtu.py +0 -0
  250. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/base.py +0 -0
  251. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/elements.py +0 -0
  252. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/env/modal.py +0 -0
  253. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/env/tab/__init__.py +0 -0
  254. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/env/tab/base.py +0 -0
  255. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/env/tab/message.py +0 -0
  256. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/files.py +0 -0
  257. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/placeholder.py +0 -0
  258. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/pyodide.py +0 -0
  259. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/sound.py +0 -0
  260. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/app/tab.py +0 -0
  261. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/struct/__init__.py +0 -0
  262. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/websocket/__init__.py +0 -0
  263. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/server/websocket/state.py +0 -0
  264. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/ssl.py +0 -0
  265. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/stream/json/__init__.py +0 -0
  266. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/stream/string.py +0 -0
  267. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/tcp/__init__.py +0 -0
  268. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/tcp/create.py +0 -0
  269. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/tcp/telnet/codes.py +0 -0
  270. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/tcp/telnet/np_05b.py +0 -0
  271. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/udp/__init__.py +0 -0
  272. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/udp/create.py +0 -0
  273. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/udp/tftp/__init__.py +0 -0
  274. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/udp/tftp/endpoint.py +0 -0
  275. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/udp/tftp/enums.py +0 -0
  276. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/udp/tftp/io.py +0 -0
  277. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/util.py +0 -0
  278. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/net/websocket/__init__.py +0 -0
  279. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/noise/__init__.py +0 -0
  280. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/__init__.py +0 -0
  281. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/bool.py +0 -0
  282. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/byte_order.py +0 -0
  283. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/evaluation.py +0 -0
  284. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/field/manager/__init__.py +0 -0
  285. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/float.py +0 -0
  286. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/int.py +0 -0
  287. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/scaling.py +0 -0
  288. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/serializable/__init__.py +0 -0
  289. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/serializable/framer.py +0 -0
  290. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/string.py +0 -0
  291. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/types/__init__.py +0 -0
  292. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/types/bool.py +0 -0
  293. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/types/float.py +0 -0
  294. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/primitives/types/int.py +0 -0
  295. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/py.typed +0 -0
  296. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/registry/bool.py +0 -0
  297. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/registry/item.py +0 -0
  298. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/sample/__init__.py +0 -0
  299. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/sample/peer.py +0 -0
  300. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/sample/program.py +0 -0
  301. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/schemas.py +0 -0
  302. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/struct/__init__.py +0 -0
  303. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/subprocess/__init__.py +0 -0
  304. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/subprocess/interface.py +0 -0
  305. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/subprocess/peer.py +0 -0
  306. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/subprocess/program.py +0 -0
  307. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/subprocess/protocol.py +0 -0
  308. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/task/__init__.py +0 -0
  309. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/task/asynchronous.py +0 -0
  310. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/task/basic/__init__.py +0 -0
  311. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/task/basic/manager.py +0 -0
  312. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/task/basic/periodic.py +0 -0
  313. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/task/sample.py +0 -0
  314. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/task/trig/__init__.py +0 -0
  315. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/telemetry/__init__.py +0 -0
  316. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/telemetry/sample.py +0 -0
  317. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/tui/__init__.py +0 -0
  318. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/tui/channels/__init__.py +0 -0
  319. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/tui/cursor.py +0 -0
  320. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/tui/mixin.py +0 -0
  321. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/tui/mock.py +0 -0
  322. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/tui/task.py +0 -0
  323. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/ui/__init__.py +0 -0
  324. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy/util.py +0 -0
  325. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy.egg-info/dependency_links.txt +0 -0
  326. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy.egg-info/entry_points.txt +0 -0
  327. {runtimepy-5.14.2 → runtimepy-5.15.0}/runtimepy.egg-info/top_level.txt +0 -0
  328. {runtimepy-5.14.2 → runtimepy-5.15.0}/setup.cfg +0 -0
  329. {runtimepy-5.14.2 → runtimepy-5.15.0}/setup.py +0 -0
  330. {runtimepy-5.14.2 → runtimepy-5.15.0}/tests/test_entry.py +0 -0
  331. {runtimepy-5.14.2 → runtimepy-5.15.0}/tests/test_mapping.py +0 -0
  332. {runtimepy-5.14.2 → runtimepy-5.15.0}/tests/test_resources.py +0 -0
  333. {runtimepy-5.14.2 → runtimepy-5.15.0}/tests/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: runtimepy
3
- Version: 5.14.2
3
+ Version: 5.15.0
4
4
  Summary: A framework for implementing Python services.
5
5
  Home-page: https://github.com/libre-embedded/runtimepy
6
6
  Author: Libre Embedded
@@ -17,11 +17,11 @@ Classifier: Development Status :: 5 - Production/Stable
17
17
  Requires-Python: >=3.12
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
- Requires-Dist: aiofiles
21
- Requires-Dist: svgen>=0.7.12
22
20
  Requires-Dist: psutil
21
+ Requires-Dist: svgen>=0.8.0
22
+ Requires-Dist: aiofiles
23
23
  Requires-Dist: websockets
24
- Requires-Dist: vcorelib>=3.6.0
24
+ Requires-Dist: vcorelib>=3.6.2
25
25
  Provides-Extra: test
26
26
  Requires-Dist: pylint; extra == "test"
27
27
  Requires-Dist: flake8; extra == "test"
@@ -51,11 +51,11 @@ Dynamic: requires-python
51
51
  =====================================
52
52
  generator=datazen
53
53
  version=3.2.3
54
- hash=d3dcde1ba35cb14decfc6881b6a2d4e6
54
+ hash=db8f45762873863c99d4d7d8f996d2fb
55
55
  =====================================
56
56
  -->
57
57
 
58
- # runtimepy ([5.14.2](https://pypi.org/project/runtimepy/))
58
+ # runtimepy ([5.15.0](https://pypi.org/project/runtimepy/))
59
59
 
60
60
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
61
61
  ![Build Status](https://github.com/libre-embedded/runtimepy/workflows/Python%20Package/badge.svg)
@@ -2,11 +2,11 @@
2
2
  =====================================
3
3
  generator=datazen
4
4
  version=3.2.3
5
- hash=d3dcde1ba35cb14decfc6881b6a2d4e6
5
+ hash=db8f45762873863c99d4d7d8f996d2fb
6
6
  =====================================
7
7
  -->
8
8
 
9
- # runtimepy ([5.14.2](https://pypi.org/project/runtimepy/))
9
+ # runtimepy ([5.15.0](https://pypi.org/project/runtimepy/))
10
10
 
11
11
  [![python](https://img.shields.io/pypi/pyversions/runtimepy.svg)](https://pypi.org/project/runtimepy/)
12
12
  ![Build Status](https://github.com/libre-embedded/runtimepy/workflows/Python%20Package/badge.svg)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta:__legacy__"
4
4
 
5
5
  [project]
6
6
  name = "runtimepy"
7
- version = "5.14.2"
7
+ version = "5.15.0"
8
8
  description = "A framework for implementing Python services."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -1,7 +1,7 @@
1
1
  # =====================================
2
2
  # generator=datazen
3
3
  # version=3.2.3
4
- # hash=f2469e97ed5a3a48c5347357f12c3554
4
+ # hash=58f166da9bc0561c671ef04c334d585d
5
5
  # =====================================
6
6
 
7
7
  """
@@ -10,7 +10,7 @@ Useful defaults and other package metadata.
10
10
 
11
11
  DESCRIPTION = "A framework for implementing Python services."
12
12
  PKG_NAME = "runtimepy"
13
- VERSION = "5.14.2"
13
+ VERSION = "5.15.0"
14
14
 
15
15
  # runtimepy-specific content.
16
16
  METRICS_NAME = "metrics"
@@ -29,10 +29,7 @@ from runtimepy.primitives.int import Uint32 as _Uint32
29
29
  from runtimepy.primitives.int import Uint64 as _Uint64
30
30
  from runtimepy.primitives.types import AnyPrimitiveType as _AnyPrimitiveType
31
31
  from runtimepy.registry.item import RegistryItem as _RegistryItem
32
-
33
- Literal = int | float | bool
34
- Default = _Optional[Literal]
35
- Controls = dict[str, Literal | dict[str, Literal]]
32
+ from runtimepy.ui.controls import Controls, Default
36
33
 
37
34
 
38
35
  class Channel(_RegistryItem, _EnumMixin, _Generic[_T]):
@@ -0,0 +1,149 @@
1
+ """
2
+ A module implementing a channel environment.
3
+ """
4
+
5
+ # built-in
6
+ from contextlib import ExitStack as _ExitStack
7
+ from typing import Iterator as _Iterator
8
+ from typing import Optional
9
+ from typing import cast as _cast
10
+
11
+ # internal
12
+ from runtimepy.channel.environment.array import (
13
+ ArrayChannelEnvironment as _ArrayChannelEnvironment,
14
+ )
15
+ from runtimepy.channel.environment.create import (
16
+ CreateChannelEnvironment as _CreateChannelEnvironment,
17
+ )
18
+ from runtimepy.channel.environment.file import (
19
+ FileChannelEnvironment as _FileChannelEnvironment,
20
+ )
21
+ from runtimepy.channel.environment.telemetry import (
22
+ TelemetryChannelEnvironment as _TelemetryChannelEnvironment,
23
+ )
24
+ from runtimepy.codec.protocol import Protocol as _Protocol
25
+ from runtimepy.codec.protocol.base import FieldSpec as _FieldSpec
26
+ from runtimepy.primitives import AnyPrimitive
27
+ from runtimepy.ui.controls import Controls, Default, bit_slider
28
+
29
+
30
+ def regular_channel_controls(
31
+ primitive: AnyPrimitive, commandable: bool
32
+ ) -> Optional[Controls]:
33
+ """Get channel controls for a regular primitive."""
34
+
35
+ controls = None
36
+
37
+ if commandable and primitive.kind.is_integer and primitive.kind.bits <= 32:
38
+ controls = bit_slider(primitive.kind.bits, primitive.kind.signed)
39
+
40
+ return controls
41
+
42
+
43
+ class ChannelEnvironment(
44
+ _TelemetryChannelEnvironment,
45
+ _ArrayChannelEnvironment,
46
+ _FileChannelEnvironment,
47
+ _CreateChannelEnvironment,
48
+ ):
49
+ """A class integrating channel and enumeration registries."""
50
+
51
+ def register_protocol(
52
+ self, protocol: _Protocol, commandable: bool
53
+ ) -> None:
54
+ """Register protocol elements as named channels and fields."""
55
+
56
+ # Register any new enumerations.
57
+ self.enums.register_from_other(protocol.enum_registry)
58
+
59
+ # need to handle defaults
60
+
61
+ for item in protocol.build:
62
+ # Handle regular primitive fields.
63
+ if isinstance(item, _FieldSpec):
64
+ if item.is_array():
65
+ assert item.array_length is not None
66
+ with self.names_pushed(item.name):
67
+ for idx in range(item.array_length):
68
+ primitive = protocol.get_primitive(
69
+ item.name, index=idx
70
+ )
71
+ self.channel(
72
+ str(idx),
73
+ kind=primitive,
74
+ commandable=commandable,
75
+ enum=item.enum,
76
+ controls=regular_channel_controls(
77
+ primitive, commandable
78
+ ),
79
+ )
80
+ else:
81
+ primitive = protocol.get_primitive(item.name)
82
+ self.channel(
83
+ item.name,
84
+ kind=primitive,
85
+ commandable=commandable,
86
+ enum=item.enum,
87
+ controls=regular_channel_controls(
88
+ primitive, commandable
89
+ ),
90
+ )
91
+
92
+ # Handle nested protocols.
93
+ elif isinstance(item[0], str):
94
+ name = item[0]
95
+ candidates = protocol.serializables[name]
96
+ if isinstance(candidates[0], _Protocol):
97
+ with self.names_pushed(name):
98
+ for idx, candidate in enumerate(candidates):
99
+ with _ExitStack() as stack:
100
+ # Enter array-index namespace if applicable.
101
+ if len(candidates) > 1:
102
+ stack.enter_context(
103
+ self.names_pushed(str(idx))
104
+ )
105
+
106
+ self.register_protocol(
107
+ _cast(_Protocol, candidate), commandable
108
+ )
109
+
110
+ # Handle bit fields.
111
+ elif isinstance(item[0], int):
112
+ fields = protocol.get_fields(item[0])
113
+ for field in fields.fields.values():
114
+ field.commandable = commandable
115
+ # add sliders for non enum non bool (check enum fields too)
116
+ self.add_fields(
117
+ item[1],
118
+ fields,
119
+ commandable=commandable,
120
+ controls=bit_slider(fields.raw.kind.bits, False),
121
+ )
122
+
123
+ def search_names(
124
+ self, pattern: str, exact: bool = False
125
+ ) -> _Iterator[str]:
126
+ """Search for names belonging to this environment."""
127
+ yield from self.channels.names.search(pattern, exact=exact)
128
+
129
+ def set_default(self, key: str, default: Default) -> None:
130
+ """Set a new default value for a channel."""
131
+
132
+ chan, _ = self[key]
133
+ chan.default = default
134
+
135
+ @property
136
+ def num_defaults(self) -> int:
137
+ """
138
+ Determine the number of channels in this environment configured with
139
+ a default value.
140
+ """
141
+
142
+ result = 0
143
+
144
+ for name in self.names:
145
+ chan = self.get(name)
146
+ if chan is not None and chan[0].has_default:
147
+ result += 1
148
+
149
+ return result
@@ -28,6 +28,7 @@ from runtimepy.enum.types import EnumTypelike as _EnumTypelike
28
28
  from runtimepy.mapping import EnumMappingData as _EnumMappingData
29
29
  from runtimepy.primitives import ChannelScaling, Primitive
30
30
  from runtimepy.primitives import Primitivelike as _Primitivelike
31
+ from runtimepy.primitives.field.fields import BitFields as _BitFields
31
32
  from runtimepy.registry.name import RegistryKey as _RegistryKey
32
33
 
33
34
 
@@ -74,10 +75,22 @@ class CreateChannelEnvironment(_BaseChannelEnvironment):
74
75
 
75
76
  # Keep track of any new enum channels.
76
77
  if enum is not None:
77
- self.channel_enums[result] = self.enums[enum]
78
+ runtime = self.enums[enum]
79
+ self.channel_enums[result] = runtime
80
+ if runtime.default:
81
+ self[name] = runtime.default
78
82
 
79
83
  return self[name]
80
84
 
85
+ def add_fields(
86
+ self, name: str, fields: _BitFields, **channel_kwargs
87
+ ) -> None:
88
+ """Add bit fields to this channel environment."""
89
+
90
+ self.channel(name, kind=fields.raw, **channel_kwargs)
91
+ with self.names_pushed(name):
92
+ self.fields.add(fields, namespace=self._namespace, track=True)
93
+
81
94
  def int_channel(
82
95
  self,
83
96
  name: str,
@@ -171,6 +184,7 @@ class CreateChannelEnvironment(_BaseChannelEnvironment):
171
184
  items: _EnumMappingData = None,
172
185
  namespace: _Namespace = None,
173
186
  primitive: str = DEFAULT_ENUM_PRIMITIVE,
187
+ **kwargs,
174
188
  ) -> _RuntimeEnum:
175
189
  """Create a new enum from the environment."""
176
190
 
@@ -179,6 +193,7 @@ class CreateChannelEnvironment(_BaseChannelEnvironment):
179
193
  kind=kind,
180
194
  items=items,
181
195
  primitive=primitive,
196
+ **kwargs,
182
197
  )
183
198
  assert result is not None, f"Can't create enum '{name}'!"
184
199
  return result
@@ -33,6 +33,7 @@ def sample_int_enum(
33
33
  "nine": 9,
34
34
  "ten": 10,
35
35
  },
36
+ default="three",
36
37
  )
37
38
 
38
39
 
@@ -99,6 +100,7 @@ def sample_fields(env: ChannelEnvironment, enum: str = "SampleEnum") -> None:
99
100
  1,
100
101
  commandable=True,
101
102
  description="Sample bit flag.",
103
+ default=True,
102
104
  )
103
105
  )
104
106
  env.add_field(
@@ -109,13 +111,19 @@ def sample_fields(env: ChannelEnvironment, enum: str = "SampleEnum") -> None:
109
111
  2,
110
112
  enum=enum if enum else None,
111
113
  commandable=True,
114
+ default="three" if enum else 3,
112
115
  description="Sample bit field.",
113
116
  )
114
117
  )
115
118
  env.add_field(
116
119
  BitField(
117
- env.namespace(name="field2"), prim, 4, 4, commandable=True
118
- )
120
+ env.namespace(name="field2"),
121
+ prim,
122
+ 4,
123
+ 4,
124
+ default=0,
125
+ commandable=True,
126
+ ).set_slider()
119
127
  )
120
128
 
121
129
 
@@ -16,7 +16,6 @@ from vcorelib.io.types import JsonObject as _JsonObject
16
16
  # internal
17
17
  from runtimepy.channel import AnyChannel as _AnyChannel
18
18
  from runtimepy.channel import Channel as _Channel
19
- from runtimepy.channel import Default as _Default
20
19
  from runtimepy.channel.event.header import PrimitiveEventHeader
21
20
  from runtimepy.codec.protocol import Protocol
22
21
  from runtimepy.mapping import DEFAULT_PATTERN
@@ -29,7 +28,7 @@ from runtimepy.primitives.types.base import PythonPrimitive
29
28
  from runtimepy.registry import Registry as _Registry
30
29
  from runtimepy.registry.name import NameRegistry as _NameRegistry
31
30
  from runtimepy.registry.name import RegistryKey as _RegistryKey
32
- from runtimepy.ui.controls import Controlslike, normalize_controls
31
+ from runtimepy.ui.controls import Controlslike, Default, normalize_controls
33
32
 
34
33
 
35
34
  class ChannelNameRegistry(_NameRegistry):
@@ -92,7 +91,7 @@ class ChannelRegistry(_Registry[_Channel[_Any]]):
92
91
  enum: _RegistryKey = None,
93
92
  scaling: ChannelScaling = None,
94
93
  description: str = None,
95
- default: _Default = None,
94
+ default: Default = None,
96
95
  controls: Controlslike = None,
97
96
  **kwargs,
98
97
  ) -> _Optional[_AnyChannel]:
@@ -47,6 +47,10 @@ class FieldSpec(NamedTuple):
47
47
  enum: _Optional[_RegistryKey] = None
48
48
  array_length: _Optional[int] = None
49
49
 
50
+ def is_array(self) -> bool:
51
+ """Determine if this instance is an array."""
52
+ return self.array_length is not None and self.array_length > 1
53
+
50
54
  def asdict(self) -> _JsonObject:
51
55
  """Obtain a dictionary representing this instance."""
52
56
 
@@ -91,14 +95,14 @@ class ProtocolBase(PrimitiveArray):
91
95
  self.alias = alias
92
96
 
93
97
  # Register the byte-order enumeration if it's not present.
94
- self._enum_registry = enum_registry
95
- if not self._enum_registry.get("ByteOrder"):
96
- _ByteOrder.register_enum(self._enum_registry)
98
+ self.enum_registry = enum_registry
99
+ if not self.enum_registry.get("ByteOrder"):
100
+ _ByteOrder.register_enum(self.enum_registry)
97
101
 
98
102
  # Each instance gets its own array.
99
103
  if not isinstance(byte_order, _ByteOrder):
100
104
  byte_order = _ByteOrder(
101
- self._enum_registry["ByteOrder"].get_int(byte_order)
105
+ self.enum_registry["ByteOrder"].get_int(byte_order)
102
106
  )
103
107
 
104
108
  super().__init__(byte_order=byte_order)
@@ -108,14 +112,14 @@ class ProtocolBase(PrimitiveArray):
108
112
  self.names = names
109
113
 
110
114
  if fields is None:
111
- fields = BitFieldsManager(self.names, self._enum_registry)
115
+ fields = BitFieldsManager(self.names, self.enum_registry)
112
116
  self._fields = fields
113
117
 
114
118
  self._regular_fields: dict[str, list[_AnyPrimitive]] = {}
115
119
  self._enum_fields: dict[str, _RuntimeEnum] = {}
116
120
 
117
121
  # Keep track of the order that the protocol was created.
118
- self._build: ProtocolBuild = []
122
+ self.build: ProtocolBuild = []
119
123
 
120
124
  # Keep track of named serializables.
121
125
  self.serializables: SerializableMap = {}
@@ -154,10 +158,10 @@ class ProtocolBase(PrimitiveArray):
154
158
  """Create another protocol instance from this one."""
155
159
 
156
160
  return self.__class__(
157
- self._enum_registry,
161
+ self.enum_registry,
158
162
  names=self.names,
159
163
  fields=_copy(self._fields),
160
- build=self._build,
164
+ build=self.build,
161
165
  byte_order=self.byte_order,
162
166
  identifier=self.id,
163
167
  identifier_primitive=self.id_primitive.kind.name,
@@ -183,7 +187,7 @@ class ProtocolBase(PrimitiveArray):
183
187
  self.register_name(name)
184
188
 
185
189
  instances = self.add_to_end(serializable, array_length=array_length)
186
- self._build.append((name, len(instances)))
190
+ self.build.append((name, len(instances)))
187
191
 
188
192
  assert name not in self.serializables, name
189
193
  self.serializables[name] = instances
@@ -209,8 +213,9 @@ class ProtocolBase(PrimitiveArray):
209
213
 
210
214
  self.register_name(name)
211
215
 
216
+ runtime_enum = None
212
217
  if enum is not None:
213
- runtime_enum = self._enum_registry[enum]
218
+ runtime_enum = self.enum_registry[enum]
214
219
  self._enum_fields[name] = runtime_enum
215
220
 
216
221
  # Allow the primitive type to be overridden when passed as a
@@ -221,13 +226,20 @@ class ProtocolBase(PrimitiveArray):
221
226
  assert kind is not None
222
227
  inst = _normalize_instance(kind)
223
228
 
229
+ # Set enum defaults.
230
+ if runtime_enum is not None and runtime_enum.default:
231
+ inst.value = runtime_enum.get_int(runtime_enum.default)
232
+
224
233
  assert name not in self._regular_fields, name
225
234
  self._regular_fields[name] = self.add(inst, array_length=array_length)
226
235
 
227
236
  if track:
228
- self._build.append(
237
+ self.build.append(
229
238
  FieldSpec(
230
- name, inst.kind.name, enum, array_length=array_length
239
+ name,
240
+ inst.kind.name,
241
+ enum,
242
+ array_length=array_length,
231
243
  )
232
244
  )
233
245
 
@@ -240,7 +252,7 @@ class ProtocolBase(PrimitiveArray):
240
252
  if index is None:
241
253
  index = self._fields.add(fields)
242
254
 
243
- self._build.append((index, name))
255
+ self.build.append((index, name))
244
256
  self.add_field(name, kind=fields.raw, track=False)
245
257
 
246
258
  @contextmanager
@@ -253,6 +265,14 @@ class ProtocolBase(PrimitiveArray):
253
265
  yield new
254
266
  self._add_bit_fields(name, new)
255
267
 
268
+ def get_primitive(self, name: str, index: int = 0) -> _AnyPrimitive:
269
+ """Get an underlying primitive instance."""
270
+ return self._regular_fields[name][index]
271
+
272
+ def get_fields(self, index: int) -> _BitFields:
273
+ """Get a bit-fields instance from its build identifier."""
274
+ return self._fields.fields[index]
275
+
256
276
  def value(
257
277
  self, name: str, resolve_enum: bool = True, index: int = 0
258
278
  ) -> ProtocolPrimitive:
@@ -261,7 +281,7 @@ class ProtocolBase(PrimitiveArray):
261
281
  val: ProtocolPrimitive = 0
262
282
 
263
283
  if name in self._regular_fields:
264
- val = self._regular_fields[name][index].value
284
+ val = self.get_primitive(name, index=index).value
265
285
 
266
286
  # Resolve the enum value.
267
287
  if resolve_enum and name in self._enum_fields:
@@ -74,7 +74,7 @@ class JsonProtocol(ProtocolBase):
74
74
  json_obj.update(
75
75
  {
76
76
  name: _cast(_JsonValue, val.asdict())
77
- for name, val in self._enum_registry.items.items()
77
+ for name, val in self.enum_registry.items.items()
78
78
  if val.id in enum_ids and name not in json_obj
79
79
  }
80
80
  )
@@ -83,7 +83,7 @@ class JsonProtocol(ProtocolBase):
83
83
  build: list[
84
84
  _Union[tuple[int, str], _JsonObject, str, tuple[str, int]]
85
85
  ] = []
86
- for item in self._build:
86
+ for item in self.build:
87
87
  if isinstance(item, FieldSpec):
88
88
  build.append(item.asdict())
89
89
  else:
@@ -120,7 +120,9 @@ class JsonProtocol(ProtocolBase):
120
120
  if isinstance(item, dict):
121
121
  build.append(
122
122
  FieldSpec(
123
- item["name"], item["kind"], enum=item.get("enum")
123
+ item["name"],
124
+ item["kind"],
125
+ enum=item.get("enum"),
124
126
  )
125
127
  )
126
128
  else:
@@ -14,6 +14,7 @@ from vcorelib.namespace import CPP_DELIM, Namespace
14
14
  from runtimepy.codec.protocol import Protocol
15
15
  from runtimepy.enum import RuntimeEnum
16
16
  from runtimepy.enum.registry import DEFAULT_ENUM_PRIMITIVE, RuntimeIntEnum
17
+ from runtimepy.mixins.logging import LogLevel
17
18
  from runtimepy.primitives.byte_order import (
18
19
  DEFAULT_BYTE_ORDER,
19
20
  ByteOrder,
@@ -65,7 +66,7 @@ class TypeSystem(LoggerMixin):
65
66
  self.root_namespace = global_namespace
66
67
 
67
68
  # Register enums.
68
- for enum in [ByteOrder]:
69
+ for enum in [ByteOrder, LogLevel]:
69
70
  self.runtime_int_enum(enum)
70
71
 
71
72
  self.root_namespace = global_namespace.child(*namespace)
@@ -103,12 +104,15 @@ class TypeSystem(LoggerMixin):
103
104
  items: dict[str, int],
104
105
  *namespace: str,
105
106
  primitive: str = DEFAULT_ENUM_PRIMITIVE,
107
+ default: Union[str, bool, int] = None,
106
108
  ) -> None:
107
109
  """Register an enumeration."""
108
110
 
109
111
  name = self._name(name, *namespace, check_available=True)
110
112
 
111
- enum = self._enums.enum(name, "int", items=items, primitive=primitive)
113
+ enum = self._enums.enum(
114
+ name, "int", items=items, primitive=primitive, default=default
115
+ )
112
116
  assert enum is not None
113
117
  self._register_primitive(name, enum.primitive)
114
118
 
@@ -62,7 +62,7 @@ class PrimitiveSource(RuntimeStruct, Generic[T]):
62
62
  )
63
63
 
64
64
 
65
- class DoubleSource(PrimitiveSource[Double]):
65
+ class DoubleSource(PrimitiveSource[Double]): # pylint:disable=abstract-method
66
66
  """A simple double output source."""
67
67
 
68
68
  kind = Double
@@ -0,0 +1,16 @@
1
+ # Resource Not Found (404)
2
+
3
+ ---
4
+
5
+ <span id="target-label">target: <a id="target"></a></span>
6
+ <script>
7
+ const target = new URLSearchParams(window.location.search).get("target");
8
+ if (target) {
9
+ document.getElementById("target").href = target;
10
+ document.getElementById("target").innerHTML = target;
11
+ } else {
12
+ document.getElementById("target-label").style.display = "none";
13
+ }
14
+ </script>
15
+
16
+ home: [/](/)
@@ -9,6 +9,9 @@ config:
9
9
  # Default redirects.
10
10
  http_redirects:
11
11
  "/": "/index.html"
12
+
13
+ # wait for #326
14
+ # "/index.html": "/mux.html"
12
15
  "/index.html": "/app.html"
13
16
 
14
17
  # Serve these applications by default at these paths.