viam-sdk 0.3.0__py3-none-linux_armv6l.whl → 0.66.0__py3-none-linux_armv6l.whl

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.

Potentially problematic release.


This version of viam-sdk might be problematic. Click here for more details.

Files changed (452) hide show
  1. viam/__init__.py +29 -2
  2. viam/app/_logs.py +34 -0
  3. viam/app/app_client.py +2696 -0
  4. viam/app/billing_client.py +185 -0
  5. viam/app/data_client.py +2231 -0
  6. viam/app/ml_training_client.py +249 -0
  7. viam/app/provisioning_client.py +93 -0
  8. viam/app/viam_client.py +275 -0
  9. viam/components/arm/__init__.py +3 -26
  10. viam/components/arm/arm.py +123 -8
  11. viam/components/arm/client.py +37 -24
  12. viam/components/arm/service.py +35 -32
  13. viam/components/audio_in/__init__.py +24 -0
  14. viam/components/audio_in/audio_in.py +74 -0
  15. viam/components/audio_in/client.py +76 -0
  16. viam/components/audio_in/service.py +83 -0
  17. viam/components/audio_out/__init__.py +21 -0
  18. viam/components/audio_out/audio_out.py +72 -0
  19. viam/components/audio_out/client.py +67 -0
  20. viam/components/audio_out/service.py +63 -0
  21. viam/components/base/__init__.py +6 -11
  22. viam/components/base/base.py +134 -8
  23. viam/components/base/client.py +51 -23
  24. viam/components/base/service.py +33 -30
  25. viam/components/board/__init__.py +3 -12
  26. viam/components/board/board.py +247 -91
  27. viam/components/board/client.py +149 -83
  28. viam/components/board/service.py +63 -33
  29. viam/components/button/__init__.py +10 -0
  30. viam/components/button/button.py +41 -0
  31. viam/components/button/client.py +52 -0
  32. viam/components/button/service.py +46 -0
  33. viam/components/camera/__init__.py +3 -3
  34. viam/components/camera/camera.py +62 -27
  35. viam/components/camera/client.py +59 -27
  36. viam/components/camera/service.py +42 -65
  37. viam/components/component_base.py +28 -5
  38. viam/components/encoder/__init__.py +1 -1
  39. viam/components/encoder/client.py +25 -14
  40. viam/components/encoder/encoder.py +48 -10
  41. viam/components/encoder/service.py +14 -18
  42. viam/components/gantry/__init__.py +1 -13
  43. viam/components/gantry/client.py +80 -25
  44. viam/components/gantry/gantry.py +123 -9
  45. viam/components/gantry/service.py +51 -29
  46. viam/components/generic/__init__.py +1 -1
  47. viam/components/generic/client.py +21 -8
  48. viam/components/generic/generic.py +10 -2
  49. viam/components/generic/service.py +12 -7
  50. viam/components/gripper/__init__.py +3 -13
  51. viam/components/gripper/client.py +69 -21
  52. viam/components/gripper/gripper.py +123 -3
  53. viam/components/gripper/service.py +44 -22
  54. viam/components/input/__init__.py +1 -14
  55. viam/components/input/client.py +55 -23
  56. viam/components/input/input.py +106 -3
  57. viam/components/input/service.py +16 -21
  58. viam/components/motor/__init__.py +1 -21
  59. viam/components/motor/client.py +56 -33
  60. viam/components/motor/motor.py +127 -4
  61. viam/components/motor/service.py +33 -44
  62. viam/components/movement_sensor/__init__.py +1 -1
  63. viam/components/movement_sensor/client.py +102 -45
  64. viam/components/movement_sensor/movement_sensor.py +130 -61
  65. viam/components/movement_sensor/service.py +38 -41
  66. viam/components/pose_tracker/__init__.py +1 -1
  67. viam/components/pose_tracker/client.py +18 -7
  68. viam/components/pose_tracker/pose_tracker.py +4 -2
  69. viam/components/pose_tracker/service.py +12 -10
  70. viam/components/power_sensor/__init__.py +17 -0
  71. viam/components/power_sensor/client.py +86 -0
  72. viam/components/power_sensor/power_sensor.py +104 -0
  73. viam/components/power_sensor/service.py +72 -0
  74. viam/components/sensor/__init__.py +2 -1
  75. viam/components/sensor/client.py +26 -10
  76. viam/components/sensor/sensor.py +22 -4
  77. viam/components/sensor/service.py +20 -11
  78. viam/components/servo/__init__.py +1 -13
  79. viam/components/servo/client.py +47 -21
  80. viam/components/servo/service.py +15 -22
  81. viam/components/servo/servo.py +61 -2
  82. viam/components/switch/__init__.py +10 -0
  83. viam/components/switch/client.py +83 -0
  84. viam/components/switch/service.py +72 -0
  85. viam/components/switch/switch.py +98 -0
  86. viam/errors.py +10 -0
  87. viam/gen/app/agent/v1/agent_grpc.py +29 -0
  88. viam/gen/app/agent/v1/agent_pb2.py +47 -0
  89. viam/gen/app/agent/v1/agent_pb2.pyi +280 -0
  90. viam/gen/app/cloudslam/v1/__init__.py +0 -0
  91. viam/gen/app/cloudslam/v1/cloud_slam_grpc.py +70 -0
  92. viam/gen/app/cloudslam/v1/cloud_slam_pb2.py +54 -0
  93. viam/gen/app/cloudslam/v1/cloud_slam_pb2.pyi +384 -0
  94. viam/gen/app/data/v1/data_grpc.py +197 -8
  95. viam/gen/app/data/v1/data_pb2.py +238 -99
  96. viam/gen/app/data/v1/data_pb2.pyi +1222 -259
  97. viam/gen/app/datapipelines/__init__.py +0 -0
  98. viam/gen/app/datapipelines/v1/__init__.py +0 -0
  99. viam/gen/app/datapipelines/v1/data_pipelines_grpc.py +84 -0
  100. viam/gen/app/datapipelines/v1/data_pipelines_pb2.py +57 -0
  101. viam/gen/app/datapipelines/v1/data_pipelines_pb2.pyi +387 -0
  102. viam/gen/app/dataset/__init__.py +0 -0
  103. viam/gen/app/dataset/v1/__init__.py +0 -0
  104. viam/gen/app/dataset/v1/dataset_grpc.py +68 -0
  105. viam/gen/app/dataset/v1/dataset_pb2.py +44 -0
  106. viam/gen/app/dataset/v1/dataset_pb2.pyi +214 -0
  107. viam/gen/app/datasync/v1/data_sync_grpc.py +21 -4
  108. viam/gen/app/datasync/v1/data_sync_pb2.py +62 -128
  109. viam/gen/app/datasync/v1/data_sync_pb2.pyi +156 -199
  110. viam/gen/app/mlinference/__init__.py +0 -0
  111. viam/gen/app/mlinference/v1/__init__.py +0 -0
  112. viam/gen/app/mlinference/v1/ml_inference_grpc.py +28 -0
  113. viam/gen/app/mlinference/v1/ml_inference_pb2.py +23 -0
  114. viam/gen/app/mlinference/v1/ml_inference_pb2.pyi +63 -0
  115. viam/gen/app/mltraining/v1/ml_training_grpc.py +51 -3
  116. viam/gen/app/mltraining/v1/ml_training_pb2.py +135 -58
  117. viam/gen/app/mltraining/v1/ml_training_pb2.pyi +328 -39
  118. viam/gen/app/packages/v1/packages_grpc.py +15 -1
  119. viam/gen/app/packages/v1/packages_pb2.py +44 -64
  120. viam/gen/app/packages/v1/packages_pb2.pyi +75 -85
  121. viam/gen/app/v1/app_grpc.py +644 -3
  122. viam/gen/app/v1/app_pb2.py +695 -295
  123. viam/gen/app/v1/app_pb2.pyi +4488 -635
  124. viam/gen/app/v1/billing_grpc.py +53 -11
  125. viam/gen/app/v1/billing_pb2.py +94 -39
  126. viam/gen/app/v1/billing_pb2.pyi +391 -191
  127. viam/gen/app/v1/end_user_grpc.py +59 -0
  128. viam/gen/app/v1/end_user_pb2.py +55 -0
  129. viam/gen/app/v1/end_user_pb2.pyi +181 -0
  130. viam/gen/app/v1/robot_grpc.py +16 -1
  131. viam/gen/app/v1/robot_pb2.py +122 -94
  132. viam/gen/app/v1/robot_pb2.pyi +463 -123
  133. viam/gen/common/v1/common_pb2.py +87 -58
  134. viam/gen/common/v1/common_pb2.pyi +456 -149
  135. viam/gen/component/arm/v1/arm_grpc.py +58 -2
  136. viam/gen/component/arm/v1/arm_pb2.py +68 -51
  137. viam/gen/component/arm/v1/arm_pb2.pyi +108 -42
  138. viam/gen/component/audioin/__init__.py +0 -0
  139. viam/gen/component/audioin/v1/__init__.py +0 -0
  140. viam/gen/component/audioin/v1/audioin_grpc.py +54 -0
  141. viam/gen/component/audioin/v1/audioin_pb2.py +34 -0
  142. viam/gen/component/audioin/v1/audioin_pb2.pyi +94 -0
  143. viam/gen/component/audioinput/v1/audioinput_grpc.py +25 -2
  144. viam/gen/component/audioinput/v1/audioinput_pb2.py +36 -31
  145. viam/gen/component/audioinput/v1/audioinput_pb2.pyi +22 -22
  146. viam/gen/component/audioout/__init__.py +0 -0
  147. viam/gen/component/audioout/v1/__init__.py +0 -0
  148. viam/gen/component/audioout/v1/audioout_grpc.py +54 -0
  149. viam/gen/component/audioout/v1/audioout_pb2.py +32 -0
  150. viam/gen/component/audioout/v1/audioout_pb2.pyi +47 -0
  151. viam/gen/component/base/v1/base_grpc.py +42 -2
  152. viam/gen/component/base/v1/base_pb2.py +58 -47
  153. viam/gen/component/base/v1/base_pb2.pyi +65 -30
  154. viam/gen/component/board/v1/board_grpc.py +59 -7
  155. viam/gen/component/board/v1/board_pb2.py +94 -73
  156. viam/gen/component/board/v1/board_pb2.pyi +165 -68
  157. viam/gen/component/button/__init__.py +0 -0
  158. viam/gen/component/button/v1/__init__.py +0 -0
  159. viam/gen/component/button/v1/button_grpc.py +38 -0
  160. viam/gen/component/button/v1/button_pb2.py +28 -0
  161. viam/gen/component/button/v1/button_pb2.pyi +39 -0
  162. viam/gen/component/camera/v1/camera_grpc.py +38 -2
  163. viam/gen/component/camera/v1/camera_pb2.py +60 -43
  164. viam/gen/component/camera/v1/camera_pb2.pyi +191 -37
  165. viam/gen/component/encoder/v1/encoder_grpc.py +25 -2
  166. viam/gen/component/encoder/v1/encoder_pb2.py +36 -31
  167. viam/gen/component/encoder/v1/encoder_pb2.pyi +15 -15
  168. viam/gen/component/gantry/v1/gantry_grpc.py +47 -2
  169. viam/gen/component/gantry/v1/gantry_pb2.py +56 -43
  170. viam/gen/component/gantry/v1/gantry_pb2.pyi +67 -31
  171. viam/gen/component/generic/v1/generic_grpc.py +16 -2
  172. viam/gen/component/generic/v1/generic_pb2.py +16 -11
  173. viam/gen/component/gripper/v1/gripper_grpc.py +44 -2
  174. viam/gen/component/gripper/v1/gripper_pb2.py +48 -35
  175. viam/gen/component/gripper/v1/gripper_pb2.pyi +62 -24
  176. viam/gen/component/inputcontroller/v1/input_controller_grpc.py +28 -2
  177. viam/gen/component/inputcontroller/v1/input_controller_pb2.py +46 -41
  178. viam/gen/component/inputcontroller/v1/input_controller_pb2.pyi +32 -36
  179. viam/gen/component/motor/v1/motor_grpc.py +51 -2
  180. viam/gen/component/motor/v1/motor_pb2.py +78 -67
  181. viam/gen/component/motor/v1/motor_pb2.pyi +75 -46
  182. viam/gen/component/movementsensor/v1/movementsensor_grpc.py +48 -2
  183. viam/gen/component/movementsensor/v1/movementsensor_pb2.py +70 -63
  184. viam/gen/component/movementsensor/v1/movementsensor_pb2.pyi +84 -57
  185. viam/gen/component/posetracker/v1/pose_tracker_grpc.py +19 -2
  186. viam/gen/component/posetracker/v1/pose_tracker_pb2.py +26 -21
  187. viam/gen/component/posetracker/v1/pose_tracker_pb2.pyi +9 -13
  188. viam/gen/component/powersensor/__init__.py +0 -0
  189. viam/gen/component/powersensor/v1/__init__.py +0 -0
  190. viam/gen/component/powersensor/v1/powersensor_grpc.py +62 -0
  191. viam/gen/component/powersensor/v1/powersensor_pb2.py +42 -0
  192. viam/gen/component/powersensor/v1/powersensor_pb2.pyi +124 -0
  193. viam/gen/component/sensor/v1/sensor_grpc.py +21 -5
  194. viam/gen/component/sensor/v1/sensor_pb2.py +18 -22
  195. viam/gen/component/sensor/v1/sensor_pb2.pyi +1 -69
  196. viam/gen/component/servo/v1/servo_grpc.py +28 -2
  197. viam/gen/component/servo/v1/servo_pb2.py +42 -37
  198. viam/gen/component/servo/v1/servo_pb2.pyi +22 -26
  199. viam/gen/component/switch/__init__.py +0 -0
  200. viam/gen/component/switch/v1/__init__.py +0 -0
  201. viam/gen/component/switch/v1/switch_grpc.py +54 -0
  202. viam/gen/component/switch/v1/switch_pb2.py +40 -0
  203. viam/gen/component/switch/v1/switch_pb2.pyi +116 -0
  204. viam/gen/component/testecho/v1/testecho_grpc.py +15 -0
  205. viam/gen/component/testecho/v1/testecho_pb2.py +29 -26
  206. viam/gen/component/testecho/v1/testecho_pb2.pyi +16 -20
  207. viam/gen/module/v1/module_grpc.py +18 -0
  208. viam/gen/module/v1/module_pb2.py +36 -33
  209. viam/gen/module/v1/module_pb2.pyi +39 -34
  210. viam/gen/opentelemetry/__init__.py +0 -0
  211. viam/gen/opentelemetry/proto/__init__.py +0 -0
  212. viam/gen/opentelemetry/proto/common/__init__.py +0 -0
  213. viam/gen/opentelemetry/proto/common/v1/__init__.py +0 -0
  214. viam/gen/opentelemetry/proto/common/v1/common_grpc.py +0 -0
  215. viam/gen/opentelemetry/proto/common/v1/common_pb2.py +27 -0
  216. viam/gen/opentelemetry/proto/common/v1/common_pb2.pyi +208 -0
  217. viam/gen/opentelemetry/proto/resource/__init__.py +0 -0
  218. viam/gen/opentelemetry/proto/resource/v1/__init__.py +0 -0
  219. viam/gen/opentelemetry/proto/resource/v1/resource_grpc.py +0 -0
  220. viam/gen/opentelemetry/proto/resource/v1/resource_pb2.py +18 -0
  221. viam/gen/opentelemetry/proto/resource/v1/resource_pb2.pyi +59 -0
  222. viam/gen/opentelemetry/proto/trace/__init__.py +0 -0
  223. viam/gen/opentelemetry/proto/trace/v1/__init__.py +0 -0
  224. viam/gen/opentelemetry/proto/trace/v1/trace_grpc.py +0 -0
  225. viam/gen/opentelemetry/proto/trace/v1/trace_pb2.py +37 -0
  226. viam/gen/opentelemetry/proto/trace/v1/trace_pb2.pyi +402 -0
  227. viam/gen/proto/rpc/examples/echo/v1/echo_grpc.py +12 -0
  228. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.py +25 -22
  229. viam/gen/proto/rpc/examples/echo/v1/echo_pb2.pyi +13 -17
  230. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_grpc.py +12 -0
  231. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.py +23 -20
  232. viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.pyi +13 -17
  233. viam/gen/proto/rpc/v1/auth_grpc.py +11 -0
  234. viam/gen/proto/rpc/v1/auth_pb2.py +27 -24
  235. viam/gen/proto/rpc/v1/auth_pb2.pyi +12 -16
  236. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.py +35 -32
  237. viam/gen/proto/rpc/webrtc/v1/grpc_pb2.pyi +37 -41
  238. viam/gen/proto/rpc/webrtc/v1/signaling_grpc.py +15 -0
  239. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py +62 -57
  240. viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi +78 -69
  241. viam/gen/provisioning/__init__.py +0 -0
  242. viam/gen/provisioning/v1/__init__.py +0 -0
  243. viam/gen/provisioning/v1/provisioning_grpc.py +59 -0
  244. viam/gen/provisioning/v1/provisioning_pb2.py +45 -0
  245. viam/gen/provisioning/v1/provisioning_pb2.pyi +229 -0
  246. viam/gen/robot/v1/robot_grpc.py +144 -15
  247. viam/gen/robot/v1/robot_pb2.py +193 -119
  248. viam/gen/robot/v1/robot_pb2.pyi +565 -137
  249. viam/gen/service/datamanager/v1/data_manager_grpc.py +20 -2
  250. viam/gen/service/datamanager/v1/data_manager_pb2.py +27 -17
  251. viam/gen/service/datamanager/v1/data_manager_pb2.pyi +52 -10
  252. viam/gen/service/discovery/__init__.py +0 -0
  253. viam/gen/service/discovery/v1/__init__.py +0 -0
  254. viam/gen/service/discovery/v1/discovery_grpc.py +39 -0
  255. viam/gen/service/discovery/v1/discovery_pb2.py +29 -0
  256. viam/gen/service/discovery/v1/discovery_pb2.pyi +51 -0
  257. viam/gen/service/generic/__init__.py +0 -0
  258. viam/gen/service/generic/v1/__init__.py +0 -0
  259. viam/gen/service/generic/v1/generic_grpc.py +29 -0
  260. viam/gen/service/generic/v1/generic_pb2.py +21 -0
  261. viam/gen/service/generic/v1/generic_pb2.pyi +6 -0
  262. viam/gen/service/mlmodel/v1/mlmodel_grpc.py +9 -0
  263. viam/gen/service/mlmodel/v1/mlmodel_pb2.py +76 -29
  264. viam/gen/service/mlmodel/v1/mlmodel_pb2.pyi +307 -28
  265. viam/gen/service/motion/v1/motion_grpc.py +42 -4
  266. viam/gen/service/motion/v1/motion_pb2.py +119 -51
  267. viam/gen/service/motion/v1/motion_pb2.pyi +595 -120
  268. viam/gen/service/navigation/v1/navigation_grpc.py +49 -1
  269. viam/gen/service/navigation/v1/navigation_pb2.py +76 -51
  270. viam/gen/service/navigation/v1/navigation_pb2.pyi +188 -33
  271. viam/gen/service/sensors/v1/sensors_grpc.py +12 -0
  272. viam/gen/service/sensors/v1/sensors_pb2.py +60 -29
  273. viam/gen/service/sensors/v1/sensors_pb2.pyi +18 -21
  274. viam/gen/service/shell/v1/shell_grpc.py +27 -1
  275. viam/gen/service/shell/v1/shell_pb2.py +37 -15
  276. viam/gen/service/shell/v1/shell_pb2.pyi +260 -7
  277. viam/gen/service/slam/v1/slam_grpc.py +24 -2
  278. viam/gen/service/slam/v1/slam_pb2.py +44 -30
  279. viam/gen/service/slam/v1/slam_pb2.pyi +128 -27
  280. viam/gen/service/video/__init__.py +0 -0
  281. viam/gen/service/video/v1/__init__.py +0 -0
  282. viam/gen/service/video/v1/video_grpc.py +39 -0
  283. viam/gen/service/video/v1/video_pb2.py +29 -0
  284. viam/gen/service/video/v1/video_pb2.pyi +72 -0
  285. viam/gen/service/vision/v1/vision_grpc.py +39 -1
  286. viam/gen/service/vision/v1/vision_pb2.py +61 -45
  287. viam/gen/service/vision/v1/vision_pb2.pyi +180 -41
  288. viam/gen/service/worldstatestore/__init__.py +0 -0
  289. viam/gen/service/worldstatestore/v1/__init__.py +0 -0
  290. viam/gen/service/worldstatestore/v1/world_state_store_grpc.py +55 -0
  291. viam/gen/service/worldstatestore/v1/world_state_store_pb2.py +39 -0
  292. viam/gen/service/worldstatestore/v1/world_state_store_pb2.pyi +171 -0
  293. viam/gen/stream/__init__.py +0 -0
  294. viam/gen/stream/v1/__init__.py +0 -0
  295. viam/gen/stream/v1/stream_grpc.py +59 -0
  296. viam/gen/stream/v1/stream_pb2.py +39 -0
  297. viam/gen/stream/v1/stream_pb2.pyi +161 -0
  298. viam/gen/tagger/v1/tagger_pb2.py +9 -8
  299. viam/logging.py +160 -17
  300. viam/media/__init__.py +0 -9
  301. viam/media/audio.py +22 -10
  302. viam/media/utils/__init__.py +0 -0
  303. viam/media/utils/pil/__init__.py +55 -0
  304. viam/media/{viam_rgba_plugin.py → utils/pil/viam_rgba_plugin.py} +10 -16
  305. viam/media/viam_rgba.py +10 -0
  306. viam/media/video.py +197 -73
  307. viam/module/module.py +191 -44
  308. viam/module/resource_data_consumer.py +41 -0
  309. viam/module/service.py +9 -1
  310. viam/module/types.py +4 -5
  311. viam/operations.py +4 -3
  312. viam/proto/app/__init__.py +361 -5
  313. viam/proto/app/agent/__init__.py +28 -0
  314. viam/proto/app/billing.py +51 -27
  315. viam/proto/app/cloudslam/__init__.py +48 -0
  316. viam/proto/app/data/__init__.py +103 -17
  317. viam/proto/app/datapipelines/__init__.py +56 -0
  318. viam/proto/app/dataset/__init__.py +40 -0
  319. viam/proto/app/datasync/__init__.py +11 -5
  320. viam/proto/app/end_user.py +34 -0
  321. viam/proto/app/mlinference/__init__.py +15 -0
  322. viam/proto/app/mltraining/__init__.py +25 -1
  323. viam/proto/app/packages/__init__.py +3 -3
  324. viam/proto/app/robot.py +19 -1
  325. viam/proto/common/__init__.py +35 -8
  326. viam/proto/component/arm/__init__.py +9 -1
  327. viam/proto/component/audioin/__init__.py +16 -0
  328. viam/proto/component/audioinput/__init__.py +3 -1
  329. viam/proto/component/audioout/__init__.py +15 -0
  330. viam/proto/component/base/__init__.py +7 -1
  331. viam/proto/component/board/__init__.py +13 -5
  332. viam/proto/component/button/__init__.py +15 -0
  333. viam/proto/component/camera/__init__.py +9 -1
  334. viam/proto/component/encoder/__init__.py +3 -1
  335. viam/proto/component/gantry/__init__.py +7 -1
  336. viam/proto/component/generic/__init__.py +3 -1
  337. viam/proto/component/gripper/__init__.py +7 -1
  338. viam/proto/component/inputcontroller/__init__.py +7 -1
  339. viam/proto/component/motor/__init__.py +7 -1
  340. viam/proto/component/movementsensor/__init__.py +7 -1
  341. viam/proto/component/posetracker/__init__.py +7 -1
  342. viam/proto/component/powersensor/__init__.py +30 -0
  343. viam/proto/component/sensor/__init__.py +3 -4
  344. viam/proto/component/servo/__init__.py +3 -1
  345. viam/proto/component/switch/__init__.py +26 -0
  346. viam/proto/component/testecho/__init__.py +3 -1
  347. viam/proto/module/__init__.py +3 -1
  348. viam/proto/opentelemetry/__init__.py +0 -0
  349. viam/proto/opentelemetry/proto/__init__.py +0 -0
  350. viam/proto/opentelemetry/proto/common/__init__.py +15 -0
  351. viam/proto/opentelemetry/proto/resource/__init__.py +10 -0
  352. viam/proto/opentelemetry/proto/trace/__init__.py +15 -0
  353. viam/proto/provisioning/__init__.py +42 -0
  354. viam/proto/robot/__init__.py +57 -9
  355. viam/proto/rpc/auth.py +11 -1
  356. viam/proto/rpc/examples/echo/__init__.py +3 -1
  357. viam/proto/rpc/examples/echoresource/__init__.py +7 -1
  358. viam/proto/rpc/webrtc/grpc.py +3 -1
  359. viam/proto/rpc/webrtc/signaling.py +5 -1
  360. viam/proto/service/datamanager/__init__.py +15 -2
  361. viam/proto/service/discovery/__init__.py +15 -0
  362. viam/proto/service/generic/__init__.py +12 -0
  363. viam/proto/service/mlmodel/__init__.py +27 -1
  364. viam/proto/service/motion/__init__.py +35 -5
  365. viam/proto/service/navigation/__init__.py +19 -1
  366. viam/proto/service/sensors/__init__.py +3 -1
  367. viam/proto/service/shell/__init__.py +25 -2
  368. viam/proto/service/slam/__init__.py +13 -1
  369. viam/proto/service/video/__init__.py +15 -0
  370. viam/proto/service/vision/__init__.py +11 -1
  371. viam/proto/service/worldstatestore/__init__.py +32 -0
  372. viam/proto/stream/__init__.py +36 -0
  373. viam/py.typed +0 -0
  374. viam/resource/base.py +45 -8
  375. viam/resource/easy_resource.py +149 -0
  376. viam/resource/manager.py +35 -14
  377. viam/resource/registry.py +40 -52
  378. viam/resource/rpc_client_base.py +33 -1
  379. viam/resource/rpc_service_base.py +15 -8
  380. viam/resource/types.py +39 -26
  381. viam/robot/client.py +458 -91
  382. viam/robot/service.py +13 -107
  383. viam/rpc/dial.py +133 -15
  384. viam/rpc/libviam_rust_utils.so +0 -0
  385. viam/rpc/server.py +59 -15
  386. viam/rpc/types.py +2 -4
  387. viam/services/discovery/__init__.py +12 -0
  388. viam/services/discovery/client.py +55 -0
  389. viam/services/discovery/discovery.py +52 -0
  390. viam/services/discovery/service.py +43 -0
  391. viam/services/generic/__init__.py +18 -0
  392. viam/services/generic/client.py +58 -0
  393. viam/services/generic/generic.py +58 -0
  394. viam/services/generic/service.py +29 -0
  395. viam/services/mlmodel/__init__.py +15 -1
  396. viam/services/mlmodel/client.py +20 -15
  397. viam/services/mlmodel/mlmodel.py +44 -7
  398. viam/services/mlmodel/service.py +9 -13
  399. viam/services/mlmodel/utils.py +101 -0
  400. viam/services/motion/__init__.py +15 -3
  401. viam/services/motion/client.py +109 -150
  402. viam/services/motion/motion.py +380 -0
  403. viam/services/motion/service.py +132 -0
  404. viam/services/navigation/__init__.py +11 -0
  405. viam/services/navigation/client.py +99 -0
  406. viam/services/navigation/navigation.py +250 -0
  407. viam/services/navigation/service.py +137 -0
  408. viam/services/service_base.py +43 -4
  409. viam/services/service_client_base.py +4 -4
  410. viam/services/slam/__init__.py +4 -1
  411. viam/services/slam/client.py +21 -11
  412. viam/services/slam/service.py +16 -19
  413. viam/services/slam/slam.py +66 -5
  414. viam/services/vision/__init__.py +8 -0
  415. viam/services/vision/client.py +115 -111
  416. viam/services/vision/service.py +143 -0
  417. viam/services/vision/vision.py +317 -0
  418. viam/services/worldstatestore/__init__.py +18 -0
  419. viam/services/worldstatestore/client.py +94 -0
  420. viam/services/worldstatestore/service.py +55 -0
  421. viam/services/worldstatestore/worldstatestore.py +90 -0
  422. viam/sessions_client.py +254 -0
  423. viam/streams.py +44 -0
  424. viam/utils.py +143 -15
  425. viam/version_metadata.py +4 -0
  426. viam_sdk-0.66.0.dist-info/METADATA +157 -0
  427. viam_sdk-0.66.0.dist-info/RECORD +531 -0
  428. {viam_sdk-0.3.0.dist-info → viam_sdk-0.66.0.dist-info}/WHEEL +1 -1
  429. viam/components/audio_input/__init__.py +0 -18
  430. viam/components/audio_input/audio_input.py +0 -79
  431. viam/components/audio_input/client.py +0 -60
  432. viam/components/audio_input/service.py +0 -118
  433. viam/components/types.py +0 -5
  434. viam/gen/app/model/v1/model_grpc.py +0 -39
  435. viam/gen/app/model/v1/model_pb2.py +0 -71
  436. viam/gen/app/model/v1/model_pb2.pyi +0 -285
  437. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_grpc.py +0 -21
  438. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_pb2.py +0 -18
  439. viam/gen/proto/rpc/examples/fileupload/v1/fileupload_pb2.pyi +0 -49
  440. viam/media/media.py +0 -53
  441. viam/proto/app/model/__init__.py +0 -40
  442. viam/proto/rpc/examples/fileupload/__init__.py +0 -13
  443. viam/services/sensors/__init__.py +0 -5
  444. viam/services/sensors/client.py +0 -63
  445. viam_sdk-0.3.0.dist-info/LICENSE +0 -202
  446. viam_sdk-0.3.0.dist-info/METADATA +0 -122
  447. viam_sdk-0.3.0.dist-info/RECORD +0 -372
  448. /viam/{gen/app/model → app}/__init__.py +0 -0
  449. /viam/gen/app/{model/v1 → agent}/__init__.py +0 -0
  450. /viam/gen/{proto/rpc/examples/fileupload → app/agent/v1}/__init__.py +0 -0
  451. /viam/gen/{proto/rpc/examples/fileupload/v1 → app/cloudslam}/__init__.py +0 -0
  452. /LICENSE → /viam_sdk-0.66.0.dist-info/licenses/LICENSE +0 -0
@@ -1,11 +1,11 @@
1
1
  from datetime import timedelta
2
- from multiprocessing import Queue
3
2
  from typing import Any, Dict, List, Mapping, Optional
4
3
 
5
4
  from google.protobuf.duration_pb2 import Duration
6
5
  from grpclib.client import Channel
6
+ from grpclib.client import Stream as ClientStream
7
7
 
8
- from viam.proto.common import BoardStatus, DoCommandRequest, DoCommandResponse
8
+ from viam.proto.common import DoCommandRequest, DoCommandResponse, Geometry
9
9
  from viam.proto.component.board import (
10
10
  BoardServiceStub,
11
11
  GetDigitalInterruptValueRequest,
@@ -18,31 +18,48 @@ from viam.proto.component.board import (
18
18
  PWMRequest,
19
19
  PWMResponse,
20
20
  ReadAnalogReaderRequest,
21
- ReadAnalogReaderResponse,
22
21
  SetGPIORequest,
23
22
  SetPowerModeRequest,
24
23
  SetPWMFrequencyRequest,
25
24
  SetPWMRequest,
26
- StatusRequest,
27
- StatusResponse,
25
+ StreamTicksRequest,
26
+ StreamTicksResponse,
27
+ WriteAnalogRequest,
28
28
  )
29
- from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
30
- from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
29
+ from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase, ResourceRPCClientBase
30
+ from viam.streams import StreamWithIterator
31
+ from viam.utils import ValueTypes, dict_to_struct, get_geometries, struct_to_dict
31
32
 
32
- from .board import Board, PostProcessor
33
+ from .board import Board, TickStream
33
34
 
34
35
 
35
- class AnalogReaderClient(Board.AnalogReader):
36
+ class AnalogClient(Board.Analog):
36
37
  def __init__(self, name: str, board: "BoardClient"):
37
38
  self.board = board
38
39
  super().__init__(name)
39
40
 
40
- async def read(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> int:
41
- if extra is None:
42
- extra = {}
41
+ async def read(
42
+ self,
43
+ *,
44
+ extra: Optional[Dict[str, Any]] = None,
45
+ timeout: Optional[float] = None,
46
+ **kwargs,
47
+ ) -> Board.Analog.Value:
48
+ md = kwargs.get("metadata", ResourceRPCClientBase.Metadata()).proto
43
49
  request = ReadAnalogReaderRequest(board_name=self.board.name, analog_reader_name=self.name, extra=dict_to_struct(extra))
44
- response: ReadAnalogReaderResponse = await self.board.client.ReadAnalogReader(request, timeout=timeout)
45
- return response.value
50
+ return await self.board.client.ReadAnalogReader(request, timeout=timeout, metadata=md)
51
+
52
+ async def write(
53
+ self,
54
+ value: int,
55
+ *,
56
+ extra: Optional[Dict[str, Any]] = None,
57
+ timeout: Optional[float] = None,
58
+ **kwargs,
59
+ ):
60
+ md = kwargs.get("metadata", ResourceRPCClientBase.Metadata()).proto
61
+ request = WriteAnalogRequest(name=self.board.name, pin=self.name, value=value, extra=dict_to_struct(extra))
62
+ await self.board.client.WriteAnalog(request, timeout=timeout, metadata=md)
46
63
 
47
64
 
48
65
  class DigitalInterruptClient(Board.DigitalInterrupt):
@@ -50,66 +67,95 @@ class DigitalInterruptClient(Board.DigitalInterrupt):
50
67
  self.board = board
51
68
  super().__init__(name)
52
69
 
53
- async def value(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> int:
54
- if extra is None:
55
- extra = {}
70
+ async def value(
71
+ self,
72
+ *,
73
+ extra: Optional[Dict[str, Any]] = None,
74
+ timeout: Optional[float] = None,
75
+ **kwargs,
76
+ ) -> int:
77
+ md = kwargs.get("metadata", ResourceRPCClientBase.Metadata()).proto
56
78
  request = GetDigitalInterruptValueRequest(board_name=self.board.name, digital_interrupt_name=self.name, extra=dict_to_struct(extra))
57
- response: GetDigitalInterruptValueResponse = await self.board.client.GetDigitalInterruptValue(request, timeout=timeout)
79
+ response: GetDigitalInterruptValueResponse = await self.board.client.GetDigitalInterruptValue(request, timeout=timeout, metadata=md)
58
80
  return response.value
59
81
 
60
- async def tick(self, high: bool, nanos: int):
61
- raise NotImplementedError()
62
-
63
- async def add_callback(self, queue: Queue):
64
- raise NotImplementedError()
65
-
66
- async def add_post_processor(self, processor: PostProcessor):
67
- raise NotImplementedError()
68
-
69
82
 
70
83
  class GPIOPinClient(Board.GPIOPin):
71
84
  def __init__(self, name: str, board: "BoardClient"):
72
85
  self.board = board
73
86
  super().__init__(name)
74
87
 
75
- async def get(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> bool:
76
- if extra is None:
77
- extra = {}
88
+ async def get(
89
+ self,
90
+ *,
91
+ extra: Optional[Dict[str, Any]] = None,
92
+ timeout: Optional[float] = None,
93
+ **kwargs,
94
+ ) -> bool:
95
+ md = kwargs.get("metadata", ResourceRPCClientBase.Metadata()).proto
78
96
  request = GetGPIORequest(name=self.board.name, pin=self.name, extra=dict_to_struct(extra))
79
- response: GetGPIOResponse = await self.board.client.GetGPIO(request, timeout=timeout)
97
+ response: GetGPIOResponse = await self.board.client.GetGPIO(request, timeout=timeout, metadata=md)
80
98
  return response.high
81
99
 
82
- async def set(self, high: bool, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None):
83
- if extra is None:
84
- extra = {}
100
+ async def set(
101
+ self,
102
+ high: bool,
103
+ *,
104
+ extra: Optional[Dict[str, Any]] = None,
105
+ timeout: Optional[float] = None,
106
+ **kwargs,
107
+ ):
108
+ md = kwargs.get("metadata", ResourceRPCClientBase.Metadata()).proto
85
109
  request = SetGPIORequest(name=self.board.name, pin=self.name, high=high, extra=dict_to_struct(extra))
86
- await self.board.client.SetGPIO(request, timeout=timeout)
110
+ await self.board.client.SetGPIO(request, timeout=timeout, metadata=md)
87
111
 
88
- async def get_pwm(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> float:
89
- if extra is None:
90
- extra = {}
112
+ async def get_pwm(
113
+ self,
114
+ *,
115
+ extra: Optional[Dict[str, Any]] = None,
116
+ timeout: Optional[float] = None,
117
+ **kwargs,
118
+ ) -> float:
119
+ md = kwargs.get("metadata", ResourceRPCClientBase.Metadata()).proto
91
120
  request = PWMRequest(name=self.board.name, pin=self.name, extra=dict_to_struct(extra))
92
- response: PWMResponse = await self.board.client.PWM(request, timeout=timeout)
121
+ response: PWMResponse = await self.board.client.PWM(request, timeout=timeout, metadata=md)
93
122
  return response.duty_cycle_pct
94
123
 
95
- async def set_pwm(self, duty_cycle: float, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None):
96
- if extra is None:
97
- extra = {}
124
+ async def set_pwm(
125
+ self,
126
+ duty_cycle: float,
127
+ *,
128
+ extra: Optional[Dict[str, Any]] = None,
129
+ timeout: Optional[float] = None,
130
+ **kwargs,
131
+ ):
132
+ md = kwargs.get("metadata", ResourceRPCClientBase.Metadata()).proto
98
133
  request = SetPWMRequest(name=self.board.name, pin=self.name, duty_cycle_pct=duty_cycle, extra=dict_to_struct(extra))
99
- await self.board.client.SetPWM(request, timeout=timeout)
134
+ await self.board.client.SetPWM(request, timeout=timeout, metadata=md)
100
135
 
101
- async def get_pwm_frequency(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> int:
102
- if extra is None:
103
- extra = {}
136
+ async def get_pwm_frequency(
137
+ self,
138
+ *,
139
+ extra: Optional[Dict[str, Any]] = None,
140
+ timeout: Optional[float] = None,
141
+ **kwargs,
142
+ ) -> int:
143
+ md = kwargs.get("metadata", ResourceRPCClientBase.Metadata()).proto
104
144
  request = PWMFrequencyRequest(name=self.board.name, pin=self.name, extra=dict_to_struct(extra))
105
- response: PWMFrequencyResponse = await self.board.client.PWMFrequency(request, timeout=timeout)
145
+ response: PWMFrequencyResponse = await self.board.client.PWMFrequency(request, timeout=timeout, metadata=md)
106
146
  return response.frequency_hz
107
147
 
108
- async def set_pwm_frequency(self, frequency: int, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None):
109
- if extra is None:
110
- extra = {}
148
+ async def set_pwm_frequency(
149
+ self,
150
+ frequency: int,
151
+ *,
152
+ extra: Optional[Dict[str, Any]] = None,
153
+ timeout: Optional[float] = None,
154
+ **kwargs,
155
+ ):
156
+ md = kwargs.get("metadata", ResourceRPCClientBase.Metadata()).proto
111
157
  request = SetPWMFrequencyRequest(name=self.board.name, pin=self.name, frequency_hz=frequency, extra=dict_to_struct(extra))
112
- await self.board.client.SetPWMFrequency(request, timeout=timeout)
158
+ await self.board.client.SetPWMFrequency(request, timeout=timeout, metadata=md)
113
159
 
114
160
 
115
161
  class BoardClient(Board, ReconfigurableResourceRPCClientBase):
@@ -117,49 +163,37 @@ class BoardClient(Board, ReconfigurableResourceRPCClientBase):
117
163
  gRPC client for the Board component.
118
164
  """
119
165
 
166
+ _analog_names: List[str]
167
+ _digital_interrupt_names: List[str]
168
+
120
169
  def __init__(self, name: str, channel: Channel):
121
170
  self.channel = channel
122
171
  self.client = BoardServiceStub(channel)
123
- self._analog_reader_names: Optional[List[str]] = None
124
- self._digital_interrupt_names: Optional[List[str]] = None
172
+ self._analog_names = []
173
+ self._digital_interrupt_names = []
125
174
  super().__init__(name)
126
175
 
127
- async def analog_reader_by_name(self, name: str) -> Board.AnalogReader:
128
- return AnalogReaderClient(name, self)
176
+ async def analog_by_name(self, name: str) -> Board.Analog:
177
+ self._analog_names.append(name)
178
+ return AnalogClient(name, self)
129
179
 
130
180
  async def digital_interrupt_by_name(self, name: str) -> Board.DigitalInterrupt:
181
+ self._digital_interrupt_names.append(name)
131
182
  return DigitalInterruptClient(name, self)
132
183
 
133
184
  async def gpio_pin_by_name(self, name: str) -> Board.GPIOPin:
134
185
  return GPIOPinClient(name, self)
135
186
 
136
- async def analog_reader_names(self) -> List[str]:
137
- if self._analog_reader_names is None:
138
- status = await self.status()
139
- names = [name for name in status.analogs.keys()]
140
- self._analog_reader_names = names
141
- return self._analog_reader_names
142
-
143
- async def digital_interrupt_names(self) -> List[str]:
144
- if self._digital_interrupt_names is None:
145
- status = await self.status()
146
- names = [name for name in status.digital_interrupts.keys()]
147
- self._digital_interrupt_names = names
148
- return self._digital_interrupt_names
149
-
150
- async def status(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None) -> BoardStatus:
151
- if extra is None:
152
- extra = {}
153
- request = StatusRequest(name=self.name, extra=dict_to_struct(extra))
154
- response: StatusResponse = await self.client.Status(request, timeout=timeout)
155
- return response.status
156
-
157
- async def model_attributes(self) -> Board.Attributes:
158
- return Board.Attributes(remote=True)
159
-
160
- async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None) -> Mapping[str, ValueTypes]:
187
+ async def do_command(
188
+ self,
189
+ command: Mapping[str, ValueTypes],
190
+ *,
191
+ timeout: Optional[float] = None,
192
+ **kwargs,
193
+ ) -> Mapping[str, ValueTypes]:
194
+ md = kwargs.get("metadata", self.Metadata()).proto
161
195
  request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
162
- response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout)
196
+ response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
163
197
  return struct_to_dict(response.result)
164
198
 
165
199
  async def set_power_mode(
@@ -167,10 +201,42 @@ class BoardClient(Board, ReconfigurableResourceRPCClientBase):
167
201
  mode: PowerMode.ValueType,
168
202
  duration: Optional[timedelta] = None,
169
203
  *,
204
+ extra: Optional[Dict[str, Any]] = None,
170
205
  timeout: Optional[float] = None,
206
+ **kwargs,
171
207
  ):
208
+ md = kwargs.get("metadata", self.Metadata()).proto
172
209
  duration_pb: Optional[Duration] = None
173
210
  if duration is not None:
174
211
  duration_pb = [(d, d.FromTimedelta(duration)) for d in [Duration()]][0][0]
175
- request = SetPowerModeRequest(name=self.name, power_mode=mode, duration=duration_pb)
176
- await self.client.SetPowerMode(request, timeout=timeout)
212
+ request = SetPowerModeRequest(name=self.name, power_mode=mode, duration=duration_pb, extra=dict_to_struct(extra))
213
+ await self.client.SetPowerMode(request, timeout=timeout, metadata=md)
214
+
215
+ async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]:
216
+ md = kwargs.get("metadata", self.Metadata())
217
+ return await get_geometries(self.client, self.name, extra, timeout, md)
218
+
219
+ async def stream_ticks(
220
+ self,
221
+ interrupts: List[Board.DigitalInterrupt],
222
+ *,
223
+ extra: Optional[Dict[str, Any]] = None,
224
+ **kwargs,
225
+ ) -> TickStream:
226
+ names = []
227
+ for di in interrupts:
228
+ names.append(di.name)
229
+ request = StreamTicksRequest(name=self.name, pin_names=names, extra=dict_to_struct(extra))
230
+
231
+ async def read():
232
+ md = kwargs.get("metadata", self.Metadata()).proto
233
+ tick_stream: ClientStream[StreamTicksRequest, StreamTicksResponse]
234
+ async with self.client.StreamTicks.open(metadata=md) as tick_stream:
235
+ try:
236
+ await tick_stream.send_message(request, end=True)
237
+ async for tick in tick_stream:
238
+ yield tick
239
+ except Exception as e:
240
+ raise (e)
241
+
242
+ return StreamWithIterator(read())
@@ -1,7 +1,9 @@
1
1
  from grpclib.server import Stream
2
+ from h2.exceptions import StreamClosedError
2
3
 
3
4
  from viam.errors import ResourceNotFoundError
4
- from viam.proto.common import DoCommandRequest, DoCommandResponse
5
+ from viam.logging import getLogger
6
+ from viam.proto.common import DoCommandRequest, DoCommandResponse, GetGeometriesRequest, GetGeometriesResponse
5
7
  from viam.proto.component.board import (
6
8
  BoardServiceBase,
7
9
  GetDigitalInterruptValueRequest,
@@ -22,14 +24,18 @@ from viam.proto.component.board import (
22
24
  SetPWMFrequencyResponse,
23
25
  SetPWMRequest,
24
26
  SetPWMResponse,
25
- StatusRequest,
26
- StatusResponse,
27
+ StreamTicksRequest,
28
+ StreamTicksResponse,
29
+ WriteAnalogRequest,
30
+ WriteAnalogResponse,
27
31
  )
28
32
  from viam.resource.rpc_service_base import ResourceRPCServiceBase
29
33
  from viam.utils import dict_to_struct, struct_to_dict
30
34
 
31
35
  from .board import Board
32
36
 
37
+ LOGGER = getLogger(__name__)
38
+
33
39
 
34
40
  class BoardRPCService(BoardServiceBase, ResourceRPCServiceBase[Board]):
35
41
  """
@@ -38,25 +44,12 @@ class BoardRPCService(BoardServiceBase, ResourceRPCServiceBase[Board]):
38
44
 
39
45
  RESOURCE_TYPE = Board
40
46
 
41
- async def Status(self, stream: Stream[StatusRequest, StatusResponse]) -> None:
42
- request = await stream.recv_message()
43
- assert request is not None
44
- name = request.name
45
- try:
46
- board = self.get_resource(name)
47
- except ResourceNotFoundError as e:
48
- raise e.grpc_error
49
- timeout = stream.deadline.time_remaining() if stream.deadline else None
50
- status = await board.status(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
51
- response = StatusResponse(status=status)
52
- await stream.send_message(response)
53
-
54
47
  async def SetGPIO(self, stream: Stream[SetGPIORequest, SetGPIOResponse]) -> None:
55
48
  request = await stream.recv_message()
56
49
  assert request is not None
57
50
  name = request.name
51
+ board = self.get_resource(name)
58
52
  try:
59
- board = self.get_resource(name)
60
53
  pin = await board.gpio_pin_by_name(request.pin)
61
54
  except ResourceNotFoundError as e:
62
55
  raise e.grpc_error
@@ -69,8 +62,8 @@ class BoardRPCService(BoardServiceBase, ResourceRPCServiceBase[Board]):
69
62
  request = await stream.recv_message()
70
63
  assert request is not None
71
64
  name = request.name
65
+ board = self.get_resource(name)
72
66
  try:
73
- board = self.get_resource(name)
74
67
  pin = await board.gpio_pin_by_name(request.pin)
75
68
  except ResourceNotFoundError as e:
76
69
  raise e.grpc_error
@@ -83,8 +76,8 @@ class BoardRPCService(BoardServiceBase, ResourceRPCServiceBase[Board]):
83
76
  request = await stream.recv_message()
84
77
  assert request is not None
85
78
  name = request.name
79
+ board = self.get_resource(name)
86
80
  try:
87
- board = self.get_resource(name)
88
81
  pin = await board.gpio_pin_by_name(request.pin)
89
82
  except ResourceNotFoundError as e:
90
83
  raise e.grpc_error
@@ -97,8 +90,8 @@ class BoardRPCService(BoardServiceBase, ResourceRPCServiceBase[Board]):
97
90
  request = await stream.recv_message()
98
91
  assert request is not None
99
92
  name = request.name
93
+ board = self.get_resource(name)
100
94
  try:
101
- board = self.get_resource(name)
102
95
  pin = await board.gpio_pin_by_name(request.pin)
103
96
  except ResourceNotFoundError as e:
104
97
  raise e.grpc_error
@@ -111,8 +104,8 @@ class BoardRPCService(BoardServiceBase, ResourceRPCServiceBase[Board]):
111
104
  request = await stream.recv_message()
112
105
  assert request is not None
113
106
  name = request.name
107
+ board = self.get_resource(name)
114
108
  try:
115
- board = self.get_resource(name)
116
109
  pin = await board.gpio_pin_by_name(request.pin)
117
110
  except ResourceNotFoundError as e:
118
111
  raise e.grpc_error
@@ -125,8 +118,8 @@ class BoardRPCService(BoardServiceBase, ResourceRPCServiceBase[Board]):
125
118
  request = await stream.recv_message()
126
119
  assert request is not None
127
120
  name = request.name
121
+ board = self.get_resource(name)
128
122
  try:
129
- board = self.get_resource(name)
130
123
  pin = await board.gpio_pin_by_name(request.pin)
131
124
  except ResourceNotFoundError as e:
132
125
  raise e.grpc_error
@@ -139,22 +132,21 @@ class BoardRPCService(BoardServiceBase, ResourceRPCServiceBase[Board]):
139
132
  request = await stream.recv_message()
140
133
  assert request is not None
141
134
  name = request.board_name
135
+ board = self.get_resource(name)
142
136
  try:
143
- board = self.get_resource(name)
144
- analog_reader = await board.analog_reader_by_name(request.analog_reader_name)
137
+ analog_reader = await board.analog_by_name(request.analog_reader_name)
145
138
  except ResourceNotFoundError as e:
146
139
  raise e.grpc_error
147
140
  timeout = stream.deadline.time_remaining() if stream.deadline else None
148
- value = await analog_reader.read(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
149
- response = ReadAnalogReaderResponse(value=value)
141
+ response = await analog_reader.read(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
150
142
  await stream.send_message(response)
151
143
 
152
144
  async def GetDigitalInterruptValue(self, stream: Stream[GetDigitalInterruptValueRequest, GetDigitalInterruptValueResponse]) -> None:
153
145
  request = await stream.recv_message()
154
146
  assert request is not None
155
147
  name = request.board_name
148
+ board = self.get_resource(name)
156
149
  try:
157
- board = self.get_resource(name)
158
150
  interrupt = await board.digital_interrupt_by_name(request.digital_interrupt_name)
159
151
  except ResourceNotFoundError as e:
160
152
  raise e.grpc_error
@@ -167,28 +159,66 @@ class BoardRPCService(BoardServiceBase, ResourceRPCServiceBase[Board]):
167
159
  request = await stream.recv_message()
168
160
  assert request is not None
169
161
  name = request.name
170
- try:
171
- board = self.get_resource(name)
172
- except ResourceNotFoundError as e:
173
- raise e.grpc_error
162
+ board = self.get_resource(name)
174
163
  timeout = stream.deadline.time_remaining() if stream.deadline else None
175
164
  await board.set_power_mode(
176
165
  mode=request.power_mode,
177
166
  duration=request.duration.ToTimedelta(),
167
+ extra=struct_to_dict(request.extra),
178
168
  timeout=timeout,
179
169
  metadata=stream.metadata,
180
170
  )
181
171
  response = SetPowerModeResponse()
182
172
  await stream.send_message(response)
183
173
 
184
- async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
174
+ async def WriteAnalog(self, stream: Stream[WriteAnalogRequest, WriteAnalogResponse]) -> None:
185
175
  request = await stream.recv_message()
186
176
  assert request is not None
177
+ name = request.name
178
+ board = self.get_resource(name)
187
179
  try:
188
- board = self.get_resource(request.name)
180
+ analog_writer = await board.analog_by_name(request.pin)
189
181
  except ResourceNotFoundError as e:
190
182
  raise e.grpc_error
191
183
  timeout = stream.deadline.time_remaining() if stream.deadline else None
184
+ await analog_writer.write(value=request.value, timeout=timeout, metadata=stream.metadata, extra=struct_to_dict(request.extra))
185
+ response = WriteAnalogResponse()
186
+ await stream.send_message(response)
187
+
188
+ async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
189
+ request = await stream.recv_message()
190
+ assert request is not None
191
+ board = self.get_resource(request.name)
192
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
192
193
  result = await board.do_command(command=struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
193
194
  response = DoCommandResponse(result=dict_to_struct(result))
194
195
  await stream.send_message(response)
196
+
197
+ async def GetGeometries(self, stream: Stream[GetGeometriesRequest, GetGeometriesResponse]) -> None:
198
+ request = await stream.recv_message()
199
+ assert request is not None
200
+ arm = self.get_resource(request.name)
201
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
202
+ geometries = await arm.get_geometries(extra=struct_to_dict(request.extra), timeout=timeout)
203
+ response = GetGeometriesResponse(geometries=geometries)
204
+ await stream.send_message(response)
205
+
206
+ async def StreamTicks(self, stream: Stream[StreamTicksRequest, StreamTicksResponse]) -> None:
207
+ request = await stream.recv_message()
208
+ assert request is not None
209
+ name = request.name
210
+ board = self.get_resource(name)
211
+
212
+ dis = []
213
+ for name in request.pin_names:
214
+ dis.append(await board.digital_interrupt_by_name(name))
215
+
216
+ tick_stream = await board.stream_ticks(interrupts=dis, metadata=stream.metadata)
217
+ async for tick in tick_stream:
218
+ try:
219
+ await stream.send_message(tick)
220
+ except StreamClosedError:
221
+ return
222
+ except Exception as e:
223
+ LOGGER.error(e)
224
+ return
@@ -0,0 +1,10 @@
1
+ import viam.gen.component.button.v1.button_pb2
2
+ from viam.resource.registry import Registry, ResourceRegistration
3
+
4
+ from .button import Button
5
+ from .client import ButtonClient
6
+ from .service import ButtonRPCService
7
+
8
+ __all__ = ["Button"]
9
+
10
+ Registry.register_api(ResourceRegistration(Button, ButtonRPCService, lambda name, channel: ButtonClient(name, channel)))
@@ -0,0 +1,41 @@
1
+ import abc
2
+ from typing import Any, Final, Mapping, Optional
3
+
4
+ from viam.components.component_base import ComponentBase
5
+ from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT
6
+
7
+
8
+ class Button(ComponentBase):
9
+ """
10
+ Button represents a device that can be pushed.
11
+
12
+ This acts as an abstract base class for any drivers representing specific
13
+ button implementations. This cannot be used on its own. If the ``__init__()`` function is
14
+ overridden, it must call the ``super().__init__()`` function.
15
+
16
+ ::
17
+
18
+ from viam.components.button import Button
19
+
20
+ For more information, see `Button component <https://docs.viam.com/dev/reference/apis/components/button/>` _.
21
+ """
22
+
23
+ API: Final = API( # pyright: ignore [reportIncompatibleVariableOverride]
24
+ RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "button"
25
+ )
26
+
27
+ @abc.abstractmethod
28
+ async def push(self, *, extra: Optional[Mapping[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> None:
29
+ """
30
+ Push the button.
31
+
32
+ ::
33
+
34
+ my_button = Button.from_robot(robot=machine, name="my_button")
35
+
36
+ # Push the button
37
+ await my_button.push()
38
+
39
+ For more information, see `Button component <https://docs.viam.com/dev/reference/apis/components/button/>` _.
40
+ """
41
+ ...
@@ -0,0 +1,52 @@
1
+ from typing import Any, Mapping, Optional
2
+
3
+ from grpclib.client import Channel
4
+
5
+ from viam.gen.component.button.v1.button_pb2 import PushRequest
6
+ from viam.proto.common import (
7
+ DoCommandRequest,
8
+ DoCommandResponse,
9
+ )
10
+ from viam.proto.component.button import ButtonServiceStub
11
+ from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
12
+ from viam.utils import (
13
+ ValueTypes,
14
+ dict_to_struct,
15
+ struct_to_dict,
16
+ )
17
+
18
+ from .button import Button
19
+
20
+
21
+ class ButtonClient(Button, ReconfigurableResourceRPCClientBase):
22
+ """
23
+ gRPC client for Button component
24
+ """
25
+
26
+ def __init__(self, name: str, channel: Channel):
27
+ self.channel = channel
28
+ self.client = ButtonServiceStub(channel)
29
+ super().__init__(name)
30
+
31
+ async def push(
32
+ self,
33
+ *,
34
+ extra: Optional[Mapping[str, Any]] = None,
35
+ timeout: Optional[float] = None,
36
+ **kwargs,
37
+ ) -> None:
38
+ md = kwargs.get("metadata", self.Metadata()).proto
39
+ request = PushRequest(name=self.name, extra=dict_to_struct(extra))
40
+ await self.client.Push(request, timeout=timeout, metadata=md)
41
+
42
+ async def do_command(
43
+ self,
44
+ command: Mapping[str, ValueTypes],
45
+ *,
46
+ timeout: Optional[float] = None,
47
+ **kwargs,
48
+ ) -> Mapping[str, ValueTypes]:
49
+ md = kwargs.get("metadata", self.Metadata()).proto
50
+ request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
51
+ response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout, metadata=md)
52
+ return struct_to_dict(response.result)
@@ -0,0 +1,46 @@
1
+ from grpclib.server import Stream
2
+
3
+ from viam.gen.component.button.v1.button_pb2 import (
4
+ PushRequest,
5
+ PushResponse,
6
+ )
7
+ from viam.proto.common import (
8
+ DoCommandRequest,
9
+ DoCommandResponse,
10
+ )
11
+ from viam.proto.component.button import ButtonServiceBase
12
+ from viam.resource.rpc_service_base import ResourceRPCServiceBase
13
+ from viam.utils import dict_to_struct, struct_to_dict
14
+
15
+ from .button import Button
16
+
17
+
18
+ class ButtonRPCService(ButtonServiceBase, ResourceRPCServiceBase[Button]):
19
+ """
20
+ gRPC Service for a generic Button
21
+ """
22
+
23
+ RESOURCE_TYPE = Button
24
+
25
+ async def Push(self, stream: Stream[PushRequest, PushResponse]) -> None:
26
+ request = await stream.recv_message()
27
+ assert request is not None
28
+ name = request.name
29
+ button = self.get_resource(name)
30
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
31
+ await button.push(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
32
+ await stream.send_message(PushResponse())
33
+
34
+ async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
35
+ request = await stream.recv_message()
36
+ assert request is not None
37
+ name = request.name
38
+ button = self.get_resource(name)
39
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
40
+ result = await button.do_command(
41
+ command=struct_to_dict(request.command),
42
+ timeout=timeout,
43
+ metadata=stream.metadata,
44
+ )
45
+ response = DoCommandResponse(result=dict_to_struct(result))
46
+ await stream.send_message(response)