viam-sdk 0.45.2__py3-none-win_amd64.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.
- viam/__init__.py +71 -0
- viam/app/__init__.py +0 -0
- viam/app/_logs.py +34 -0
- viam/app/app_client.py +2525 -0
- viam/app/billing_client.py +143 -0
- viam/app/data_client.py +1715 -0
- viam/app/ml_training_client.py +251 -0
- viam/app/provisioning_client.py +95 -0
- viam/app/viam_client.py +260 -0
- viam/components/__init__.py +0 -0
- viam/components/arm/__init__.py +16 -0
- viam/components/arm/arm.py +223 -0
- viam/components/arm/client.py +124 -0
- viam/components/arm/service.py +123 -0
- viam/components/audio_input/__init__.py +18 -0
- viam/components/audio_input/audio_input.py +81 -0
- viam/components/audio_input/client.py +70 -0
- viam/components/audio_input/service.py +114 -0
- viam/components/base/__init__.py +13 -0
- viam/components/base/base.py +260 -0
- viam/components/base/client.py +153 -0
- viam/components/base/service.py +138 -0
- viam/components/board/__init__.py +9 -0
- viam/components/board/board.py +414 -0
- viam/components/board/client.py +241 -0
- viam/components/board/service.py +223 -0
- viam/components/button/__init__.py +10 -0
- viam/components/button/button.py +41 -0
- viam/components/button/client.py +52 -0
- viam/components/button/service.py +46 -0
- viam/components/camera/__init__.py +22 -0
- viam/components/camera/camera.py +138 -0
- viam/components/camera/client.py +98 -0
- viam/components/camera/service.py +105 -0
- viam/components/component_base.py +65 -0
- viam/components/encoder/__init__.py +18 -0
- viam/components/encoder/client.py +83 -0
- viam/components/encoder/encoder.py +118 -0
- viam/components/encoder/service.py +72 -0
- viam/components/gantry/__init__.py +11 -0
- viam/components/gantry/client.py +115 -0
- viam/components/gantry/gantry.py +156 -0
- viam/components/gantry/service.py +113 -0
- viam/components/generic/__init__.py +18 -0
- viam/components/generic/client.py +62 -0
- viam/components/generic/generic.py +76 -0
- viam/components/generic/service.py +40 -0
- viam/components/gripper/__init__.py +11 -0
- viam/components/gripper/client.py +85 -0
- viam/components/gripper/gripper.py +114 -0
- viam/components/gripper/service.py +81 -0
- viam/components/input/__init__.py +15 -0
- viam/components/input/client.py +194 -0
- viam/components/input/input.py +297 -0
- viam/components/input/service.py +175 -0
- viam/components/motor/__init__.py +11 -0
- viam/components/motor/client.py +168 -0
- viam/components/motor/motor.py +301 -0
- viam/components/motor/service.py +150 -0
- viam/components/movement_sensor/__init__.py +21 -0
- viam/components/movement_sensor/client.py +161 -0
- viam/components/movement_sensor/movement_sensor.py +253 -0
- viam/components/movement_sensor/service.py +146 -0
- viam/components/pose_tracker/__init__.py +17 -0
- viam/components/pose_tracker/client.py +50 -0
- viam/components/pose_tracker/pose_tracker.py +40 -0
- viam/components/pose_tracker/service.py +45 -0
- viam/components/power_sensor/__init__.py +17 -0
- viam/components/power_sensor/client.py +86 -0
- viam/components/power_sensor/power_sensor.py +104 -0
- viam/components/power_sensor/service.py +72 -0
- viam/components/sensor/__init__.py +18 -0
- viam/components/sensor/client.py +49 -0
- viam/components/sensor/sensor.py +48 -0
- viam/components/sensor/service.py +51 -0
- viam/components/servo/__init__.py +11 -0
- viam/components/servo/client.py +86 -0
- viam/components/servo/service.py +80 -0
- viam/components/servo/servo.py +114 -0
- viam/components/switch/__init__.py +10 -0
- viam/components/switch/client.py +83 -0
- viam/components/switch/service.py +72 -0
- viam/components/switch/switch.py +95 -0
- viam/errors.py +105 -0
- viam/gen/__init__.py +0 -0
- viam/gen/app/__init__.py +0 -0
- viam/gen/app/agent/__init__.py +0 -0
- viam/gen/app/agent/v1/__init__.py +0 -0
- viam/gen/app/agent/v1/agent_grpc.py +29 -0
- viam/gen/app/agent/v1/agent_pb2.py +47 -0
- viam/gen/app/agent/v1/agent_pb2.pyi +280 -0
- viam/gen/app/cloudslam/__init__.py +0 -0
- viam/gen/app/cloudslam/v1/__init__.py +0 -0
- viam/gen/app/cloudslam/v1/cloud_slam_grpc.py +70 -0
- viam/gen/app/cloudslam/v1/cloud_slam_pb2.py +54 -0
- viam/gen/app/cloudslam/v1/cloud_slam_pb2.pyi +384 -0
- viam/gen/app/data/__init__.py +0 -0
- viam/gen/app/data/v1/__init__.py +0 -0
- viam/gen/app/data/v1/data_grpc.py +206 -0
- viam/gen/app/data/v1/data_pb2.py +178 -0
- viam/gen/app/data/v1/data_pb2.pyi +1485 -0
- viam/gen/app/datapipelines/__init__.py +0 -0
- viam/gen/app/datapipelines/v1/__init__.py +0 -0
- viam/gen/app/datapipelines/v1/data_pipelines_grpc.py +84 -0
- viam/gen/app/datapipelines/v1/data_pipelines_pb2.py +56 -0
- viam/gen/app/datapipelines/v1/data_pipelines_pb2.pyi +370 -0
- viam/gen/app/dataset/__init__.py +0 -0
- viam/gen/app/dataset/v1/__init__.py +0 -0
- viam/gen/app/dataset/v1/dataset_grpc.py +60 -0
- viam/gen/app/dataset/v1/dataset_pb2.py +40 -0
- viam/gen/app/dataset/v1/dataset_pb2.pyi +179 -0
- viam/gen/app/datasync/__init__.py +0 -0
- viam/gen/app/datasync/v1/__init__.py +0 -0
- viam/gen/app/datasync/v1/data_sync_grpc.py +47 -0
- viam/gen/app/datasync/v1/data_sync_pb2.py +70 -0
- viam/gen/app/datasync/v1/data_sync_pb2.pyi +425 -0
- viam/gen/app/mlinference/__init__.py +0 -0
- viam/gen/app/mlinference/v1/__init__.py +0 -0
- viam/gen/app/mlinference/v1/ml_inference_grpc.py +28 -0
- viam/gen/app/mlinference/v1/ml_inference_pb2.py +23 -0
- viam/gen/app/mlinference/v1/ml_inference_pb2.pyi +63 -0
- viam/gen/app/mltraining/__init__.py +0 -0
- viam/gen/app/mltraining/v1/__init__.py +0 -0
- viam/gen/app/mltraining/v1/ml_training_grpc.py +78 -0
- viam/gen/app/mltraining/v1/ml_training_pb2.py +124 -0
- viam/gen/app/mltraining/v1/ml_training_pb2.pyi +415 -0
- viam/gen/app/packages/__init__.py +0 -0
- viam/gen/app/packages/v1/__init__.py +0 -0
- viam/gen/app/packages/v1/packages_grpc.py +54 -0
- viam/gen/app/packages/v1/packages_pb2.py +52 -0
- viam/gen/app/packages/v1/packages_pb2.pyi +311 -0
- viam/gen/app/v1/__init__.py +0 -0
- viam/gen/app/v1/app_grpc.py +863 -0
- viam/gen/app/v1/app_pb2.py +649 -0
- viam/gen/app/v1/app_pb2.pyi +5279 -0
- viam/gen/app/v1/billing_grpc.py +76 -0
- viam/gen/app/v1/billing_pb2.py +92 -0
- viam/gen/app/v1/billing_pb2.pyi +463 -0
- viam/gen/app/v1/end_user_grpc.py +59 -0
- viam/gen/app/v1/end_user_pb2.py +55 -0
- viam/gen/app/v1/end_user_pb2.pyi +181 -0
- viam/gen/app/v1/robot_grpc.py +55 -0
- viam/gen/app/v1/robot_pb2.py +127 -0
- viam/gen/app/v1/robot_pb2.pyi +1202 -0
- viam/gen/common/__init__.py +0 -0
- viam/gen/common/v1/__init__.py +0 -0
- viam/gen/common/v1/common_grpc.py +0 -0
- viam/gen/common/v1/common_pb2.py +78 -0
- viam/gen/common/v1/common_pb2.pyi +687 -0
- viam/gen/component/__init__.py +0 -0
- viam/gen/component/arm/__init__.py +0 -0
- viam/gen/component/arm/v1/__init__.py +0 -0
- viam/gen/component/arm/v1/arm_grpc.py +102 -0
- viam/gen/component/arm/v1/arm_pb2.py +74 -0
- viam/gen/component/arm/v1/arm_pb2.pyi +344 -0
- viam/gen/component/audioinput/__init__.py +0 -0
- viam/gen/component/audioinput/v1/__init__.py +0 -0
- viam/gen/component/audioinput/v1/audioinput_grpc.py +63 -0
- viam/gen/component/audioinput/v1/audioinput_pb2.py +45 -0
- viam/gen/component/audioinput/v1/audioinput_pb2.pyi +179 -0
- viam/gen/component/base/__init__.py +0 -0
- viam/gen/component/base/v1/__init__.py +0 -0
- viam/gen/component/base/v1/base_grpc.py +94 -0
- viam/gen/component/base/v1/base_pb2.py +66 -0
- viam/gen/component/base/v1/base_pb2.pyi +258 -0
- viam/gen/component/board/__init__.py +0 -0
- viam/gen/component/board/v1/__init__.py +0 -0
- viam/gen/component/board/v1/board_grpc.py +127 -0
- viam/gen/component/board/v1/board_pb2.py +103 -0
- viam/gen/component/board/v1/board_pb2.pyi +496 -0
- viam/gen/component/button/__init__.py +0 -0
- viam/gen/component/button/v1/__init__.py +0 -0
- viam/gen/component/button/v1/button_grpc.py +38 -0
- viam/gen/component/button/v1/button_pb2.py +28 -0
- viam/gen/component/button/v1/button_pb2.pyi +39 -0
- viam/gen/component/camera/__init__.py +0 -0
- viam/gen/component/camera/v1/__init__.py +0 -0
- viam/gen/component/camera/v1/camera_grpc.py +79 -0
- viam/gen/component/camera/v1/camera_pb2.py +67 -0
- viam/gen/component/camera/v1/camera_pb2.pyi +373 -0
- viam/gen/component/encoder/__init__.py +0 -0
- viam/gen/component/encoder/v1/__init__.py +0 -0
- viam/gen/component/encoder/v1/encoder_grpc.py +62 -0
- viam/gen/component/encoder/v1/encoder_pb2.py +44 -0
- viam/gen/component/encoder/v1/encoder_pb2.pyi +147 -0
- viam/gen/component/gantry/__init__.py +0 -0
- viam/gen/component/gantry/v1/__init__.py +0 -0
- viam/gen/component/gantry/v1/gantry_grpc.py +86 -0
- viam/gen/component/gantry/v1/gantry_pb2.py +62 -0
- viam/gen/component/gantry/v1/gantry_pb2.pyi +239 -0
- viam/gen/component/generic/__init__.py +0 -0
- viam/gen/component/generic/v1/__init__.py +0 -0
- viam/gen/component/generic/v1/generic_grpc.py +37 -0
- viam/gen/component/generic/v1/generic_pb2.py +23 -0
- viam/gen/component/generic/v1/generic_pb2.pyi +6 -0
- viam/gen/component/gripper/__init__.py +0 -0
- viam/gen/component/gripper/v1/__init__.py +0 -0
- viam/gen/component/gripper/v1/gripper_grpc.py +70 -0
- viam/gen/component/gripper/v1/gripper_pb2.py +48 -0
- viam/gen/component/gripper/v1/gripper_pb2.pyi +137 -0
- viam/gen/component/inputcontroller/__init__.py +0 -0
- viam/gen/component/inputcontroller/v1/__init__.py +0 -0
- viam/gen/component/inputcontroller/v1/input_controller_grpc.py +71 -0
- viam/gen/component/inputcontroller/v1/input_controller_pb2.py +55 -0
- viam/gen/component/inputcontroller/v1/input_controller_pb2.pyi +243 -0
- viam/gen/component/motor/__init__.py +0 -0
- viam/gen/component/motor/v1/__init__.py +0 -0
- viam/gen/component/motor/v1/motor_grpc.py +118 -0
- viam/gen/component/motor/v1/motor_pb2.py +86 -0
- viam/gen/component/motor/v1/motor_pb2.pyi +368 -0
- viam/gen/component/movementsensor/__init__.py +0 -0
- viam/gen/component/movementsensor/v1/__init__.py +0 -0
- viam/gen/component/movementsensor/v1/movementsensor_grpc.py +110 -0
- viam/gen/component/movementsensor/v1/movementsensor_pb2.py +78 -0
- viam/gen/component/movementsensor/v1/movementsensor_pb2.pyi +384 -0
- viam/gen/component/posetracker/__init__.py +0 -0
- viam/gen/component/posetracker/v1/__init__.py +0 -0
- viam/gen/component/posetracker/v1/pose_tracker_grpc.py +46 -0
- viam/gen/component/posetracker/v1/pose_tracker_pb2.py +34 -0
- viam/gen/component/posetracker/v1/pose_tracker_pb2.pyi +79 -0
- viam/gen/component/powersensor/__init__.py +0 -0
- viam/gen/component/powersensor/v1/__init__.py +0 -0
- viam/gen/component/powersensor/v1/powersensor_grpc.py +62 -0
- viam/gen/component/powersensor/v1/powersensor_pb2.py +42 -0
- viam/gen/component/powersensor/v1/powersensor_pb2.pyi +124 -0
- viam/gen/component/sensor/__init__.py +0 -0
- viam/gen/component/sensor/v1/__init__.py +0 -0
- viam/gen/component/sensor/v1/sensor_grpc.py +45 -0
- viam/gen/component/sensor/v1/sensor_pb2.py +25 -0
- viam/gen/component/sensor/v1/sensor_pb2.pyi +6 -0
- viam/gen/component/servo/__init__.py +0 -0
- viam/gen/component/servo/v1/__init__.py +0 -0
- viam/gen/component/servo/v1/servo_grpc.py +70 -0
- viam/gen/component/servo/v1/servo_pb2.py +50 -0
- viam/gen/component/servo/v1/servo_pb2.pyi +150 -0
- viam/gen/component/switch/__init__.py +0 -0
- viam/gen/component/switch/v1/__init__.py +0 -0
- viam/gen/component/switch/v1/switch_grpc.py +54 -0
- viam/gen/component/switch/v1/switch_pb2.py +40 -0
- viam/gen/component/switch/v1/switch_pb2.pyi +109 -0
- viam/gen/component/testecho/__init__.py +0 -0
- viam/gen/component/testecho/v1/__init__.py +0 -0
- viam/gen/component/testecho/v1/testecho_grpc.py +52 -0
- viam/gen/component/testecho/v1/testecho_pb2.py +36 -0
- viam/gen/component/testecho/v1/testecho_pb2.pyi +114 -0
- viam/gen/module/__init__.py +0 -0
- viam/gen/module/v1/__init__.py +0 -0
- viam/gen/module/v1/module_grpc.py +61 -0
- viam/gen/module/v1/module_pb2.py +43 -0
- viam/gen/module/v1/module_pb2.pyi +211 -0
- viam/gen/proto/__init__.py +0 -0
- viam/gen/proto/rpc/__init__.py +0 -0
- viam/gen/proto/rpc/examples/__init__.py +0 -0
- viam/gen/proto/rpc/examples/echo/__init__.py +0 -0
- viam/gen/proto/rpc/examples/echo/v1/__init__.py +0 -0
- viam/gen/proto/rpc/examples/echo/v1/echo_grpc.py +44 -0
- viam/gen/proto/rpc/examples/echo/v1/echo_pb2.py +32 -0
- viam/gen/proto/rpc/examples/echo/v1/echo_pb2.pyi +87 -0
- viam/gen/proto/rpc/examples/echoresource/__init__.py +0 -0
- viam/gen/proto/rpc/examples/echoresource/v1/__init__.py +0 -0
- viam/gen/proto/rpc/examples/echoresource/v1/echoresource_grpc.py +43 -0
- viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.py +29 -0
- viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.pyi +93 -0
- viam/gen/proto/rpc/v1/__init__.py +0 -0
- viam/gen/proto/rpc/v1/auth_grpc.py +47 -0
- viam/gen/proto/rpc/v1/auth_pb2.py +34 -0
- viam/gen/proto/rpc/v1/auth_pb2.pyi +92 -0
- viam/gen/proto/rpc/webrtc/__init__.py +0 -0
- viam/gen/proto/rpc/webrtc/v1/__init__.py +0 -0
- viam/gen/proto/rpc/webrtc/v1/grpc_grpc.py +0 -0
- viam/gen/proto/rpc/webrtc/v1/grpc_pb2.py +43 -0
- viam/gen/proto/rpc/webrtc/v1/grpc_pb2.pyi +304 -0
- viam/gen/proto/rpc/webrtc/v1/signaling_grpc.py +54 -0
- viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py +70 -0
- viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi +496 -0
- viam/gen/provisioning/__init__.py +0 -0
- viam/gen/provisioning/v1/__init__.py +0 -0
- viam/gen/provisioning/v1/provisioning_grpc.py +51 -0
- viam/gen/provisioning/v1/provisioning_pb2.py +39 -0
- viam/gen/provisioning/v1/provisioning_pb2.pyi +188 -0
- viam/gen/robot/__init__.py +0 -0
- viam/gen/robot/v1/__init__.py +0 -0
- viam/gen/robot/v1/robot_grpc.py +208 -0
- viam/gen/robot/v1/robot_pb2.py +188 -0
- viam/gen/robot/v1/robot_pb2.pyi +1020 -0
- viam/gen/service/__init__.py +0 -0
- viam/gen/service/datamanager/__init__.py +0 -0
- viam/gen/service/datamanager/v1/__init__.py +0 -0
- viam/gen/service/datamanager/v1/data_manager_grpc.py +38 -0
- viam/gen/service/datamanager/v1/data_manager_pb2.py +28 -0
- viam/gen/service/datamanager/v1/data_manager_pb2.pyi +39 -0
- viam/gen/service/discovery/__init__.py +0 -0
- viam/gen/service/discovery/v1/__init__.py +0 -0
- viam/gen/service/discovery/v1/discovery_grpc.py +39 -0
- viam/gen/service/discovery/v1/discovery_pb2.py +29 -0
- viam/gen/service/discovery/v1/discovery_pb2.pyi +51 -0
- viam/gen/service/generic/__init__.py +0 -0
- viam/gen/service/generic/v1/__init__.py +0 -0
- viam/gen/service/generic/v1/generic_grpc.py +29 -0
- viam/gen/service/generic/v1/generic_pb2.py +21 -0
- viam/gen/service/generic/v1/generic_pb2.pyi +6 -0
- viam/gen/service/mlmodel/__init__.py +0 -0
- viam/gen/service/mlmodel/v1/__init__.py +0 -0
- viam/gen/service/mlmodel/v1/mlmodel_grpc.py +37 -0
- viam/gen/service/mlmodel/v1/mlmodel_pb2.py +83 -0
- viam/gen/service/mlmodel/v1/mlmodel_pb2.pyi +480 -0
- viam/gen/service/motion/__init__.py +0 -0
- viam/gen/service/motion/v1/__init__.py +0 -0
- viam/gen/service/motion/v1/motion_grpc.py +87 -0
- viam/gen/service/motion/v1/motion_pb2.py +97 -0
- viam/gen/service/motion/v1/motion_pb2.pyi +838 -0
- viam/gen/service/navigation/__init__.py +0 -0
- viam/gen/service/navigation/v1/__init__.py +0 -0
- viam/gen/service/navigation/v1/navigation_grpc.py +102 -0
- viam/gen/service/navigation/v1/navigation_pb2.py +84 -0
- viam/gen/service/navigation/v1/navigation_pb2.pyi +419 -0
- viam/gen/service/sensors/__init__.py +0 -0
- viam/gen/service/sensors/v1/__init__.py +0 -0
- viam/gen/service/sensors/v1/sensors_grpc.py +46 -0
- viam/gen/service/sensors/v1/sensors_pb2.py +68 -0
- viam/gen/service/sensors/v1/sensors_pb2.pyi +137 -0
- viam/gen/service/shell/__init__.py +0 -0
- viam/gen/service/shell/v1/__init__.py +0 -0
- viam/gen/service/shell/v1/shell_grpc.py +55 -0
- viam/gen/service/shell/v1/shell_pb2.py +45 -0
- viam/gen/service/shell/v1/shell_pb2.pyi +307 -0
- viam/gen/service/slam/__init__.py +0 -0
- viam/gen/service/slam/v1/__init__.py +0 -0
- viam/gen/service/slam/v1/slam_grpc.py +61 -0
- viam/gen/service/slam/v1/slam_pb2.py +51 -0
- viam/gen/service/slam/v1/slam_pb2.pyi +213 -0
- viam/gen/service/vision/__init__.py +0 -0
- viam/gen/service/vision/v1/__init__.py +0 -0
- viam/gen/service/vision/v1/vision_grpc.py +87 -0
- viam/gen/service/vision/v1/vision_pb2.py +69 -0
- viam/gen/service/vision/v1/vision_pb2.pyi +454 -0
- viam/gen/stream/__init__.py +0 -0
- viam/gen/stream/v1/__init__.py +0 -0
- viam/gen/stream/v1/stream_grpc.py +59 -0
- viam/gen/stream/v1/stream_pb2.py +39 -0
- viam/gen/stream/v1/stream_pb2.pyi +161 -0
- viam/gen/tagger/__init__.py +0 -0
- viam/gen/tagger/v1/__init__.py +0 -0
- viam/gen/tagger/v1/tagger_grpc.py +0 -0
- viam/gen/tagger/v1/tagger_pb2.py +16 -0
- viam/gen/tagger/v1/tagger_pb2.pyi +15 -0
- viam/logging.py +216 -0
- viam/media/__init__.py +0 -0
- viam/media/audio.py +16 -0
- viam/media/utils/__init__.py +0 -0
- viam/media/utils/pil/__init__.py +51 -0
- viam/media/utils/pil/viam_rgba_plugin.py +73 -0
- viam/media/viam_rgba.py +10 -0
- viam/media/video.py +217 -0
- viam/module/__init__.py +5 -0
- viam/module/module.py +281 -0
- viam/module/service.py +66 -0
- viam/module/types.py +23 -0
- viam/operations.py +124 -0
- viam/proto/__init__.py +0 -0
- viam/proto/app/__init__.py +554 -0
- viam/proto/app/agent/__init__.py +28 -0
- viam/proto/app/billing.py +58 -0
- viam/proto/app/cloudslam/__init__.py +48 -0
- viam/proto/app/data/__init__.py +138 -0
- viam/proto/app/datapipelines/__init__.py +56 -0
- viam/proto/app/dataset/__init__.py +36 -0
- viam/proto/app/datasync/__init__.py +44 -0
- viam/proto/app/end_user.py +34 -0
- viam/proto/app/mlinference/__init__.py +15 -0
- viam/proto/app/mltraining/__init__.py +52 -0
- viam/proto/app/packages/__init__.py +38 -0
- viam/proto/app/robot.py +84 -0
- viam/proto/common/__init__.py +66 -0
- viam/proto/component/__init__.py +0 -0
- viam/proto/component/arm/__init__.py +48 -0
- viam/proto/component/audioinput/__init__.py +30 -0
- viam/proto/component/base/__init__.py +42 -0
- viam/proto/component/board/__init__.py +62 -0
- viam/proto/component/button/__init__.py +15 -0
- viam/proto/component/camera/__init__.py +46 -0
- viam/proto/component/encoder/__init__.py +28 -0
- viam/proto/component/gantry/__init__.py +40 -0
- viam/proto/component/generic/__init__.py +12 -0
- viam/proto/component/gripper/__init__.py +30 -0
- viam/proto/component/inputcontroller/__init__.py +38 -0
- viam/proto/component/motor/__init__.py +56 -0
- viam/proto/component/movementsensor/__init__.py +50 -0
- viam/proto/component/posetracker/__init__.py +19 -0
- viam/proto/component/powersensor/__init__.py +30 -0
- viam/proto/component/sensor/__init__.py +12 -0
- viam/proto/component/servo/__init__.py +32 -0
- viam/proto/component/switch/__init__.py +26 -0
- viam/proto/component/testecho/__init__.py +30 -0
- viam/proto/module/__init__.py +38 -0
- viam/proto/provisioning/__init__.py +36 -0
- viam/proto/robot/__init__.py +130 -0
- viam/proto/rpc/__init__.py +0 -0
- viam/proto/rpc/auth.py +34 -0
- viam/proto/rpc/examples/__init__.py +0 -0
- viam/proto/rpc/examples/echo/__init__.py +26 -0
- viam/proto/rpc/examples/echoresource/__init__.py +30 -0
- viam/proto/rpc/webrtc/__init__.py +0 -0
- viam/proto/rpc/webrtc/grpc.py +36 -0
- viam/proto/rpc/webrtc/signaling.py +58 -0
- viam/proto/service/__init__.py +0 -0
- viam/proto/service/datamanager/__init__.py +19 -0
- viam/proto/service/discovery/__init__.py +15 -0
- viam/proto/service/generic/__init__.py +12 -0
- viam/proto/service/mlmodel/__init__.py +54 -0
- viam/proto/service/motion/__init__.py +68 -0
- viam/proto/service/navigation/__init__.py +58 -0
- viam/proto/service/sensors/__init__.py +18 -0
- viam/proto/service/shell/__init__.py +36 -0
- viam/proto/service/slam/__init__.py +36 -0
- viam/proto/service/vision/__init__.py +46 -0
- viam/proto/stream/__init__.py +36 -0
- viam/proto/tagger/__init__.py +6 -0
- viam/py.typed +0 -0
- viam/resource/__init__.py +0 -0
- viam/resource/base.py +123 -0
- viam/resource/easy_resource.py +153 -0
- viam/resource/manager.py +126 -0
- viam/resource/registry.py +199 -0
- viam/resource/rpc_client_base.py +65 -0
- viam/resource/rpc_service_base.py +48 -0
- viam/resource/types.py +213 -0
- viam/robot/__init__.py +0 -0
- viam/robot/client.py +909 -0
- viam/robot/service.py +69 -0
- viam/rpc/__init__.py +0 -0
- viam/rpc/dial.py +420 -0
- viam/rpc/libviam_rust_utils.dll +0 -0
- viam/rpc/server.py +201 -0
- viam/rpc/signaling.py +29 -0
- viam/rpc/types.py +22 -0
- viam/services/__init__.py +0 -0
- viam/services/discovery/__init__.py +12 -0
- viam/services/discovery/client.py +55 -0
- viam/services/discovery/discovery.py +52 -0
- viam/services/discovery/service.py +43 -0
- viam/services/generic/__init__.py +18 -0
- viam/services/generic/client.py +58 -0
- viam/services/generic/generic.py +58 -0
- viam/services/generic/service.py +29 -0
- viam/services/mlmodel/__init__.py +24 -0
- viam/services/mlmodel/client.py +37 -0
- viam/services/mlmodel/mlmodel.py +78 -0
- viam/services/mlmodel/service.py +38 -0
- viam/services/mlmodel/utils.py +101 -0
- viam/services/motion/__init__.py +17 -0
- viam/services/motion/client.py +215 -0
- viam/services/motion/motion.py +378 -0
- viam/services/motion/service.py +132 -0
- viam/services/navigation/__init__.py +11 -0
- viam/services/navigation/client.py +99 -0
- viam/services/navigation/navigation.py +250 -0
- viam/services/navigation/service.py +137 -0
- viam/services/service_base.py +78 -0
- viam/services/service_client_base.py +46 -0
- viam/services/slam/__init__.py +17 -0
- viam/services/slam/client.py +62 -0
- viam/services/slam/service.py +75 -0
- viam/services/slam/slam.py +111 -0
- viam/services/vision/__init__.py +15 -0
- viam/services/vision/client.py +206 -0
- viam/services/vision/service.py +146 -0
- viam/services/vision/vision.py +315 -0
- viam/sessions_client.py +245 -0
- viam/streams.py +44 -0
- viam/utils.py +365 -0
- viam/version_metadata.py +4 -0
- viam_sdk-0.45.2.dist-info/METADATA +157 -0
- viam_sdk-0.45.2.dist-info/RECORD +476 -0
- viam_sdk-0.45.2.dist-info/WHEEL +4 -0
- viam_sdk-0.45.2.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
import typing
|
|
3
|
+
import grpclib.const
|
|
4
|
+
import grpclib.client
|
|
5
|
+
import grpclib.exceptions
|
|
6
|
+
if typing.TYPE_CHECKING:
|
|
7
|
+
import grpclib.server
|
|
8
|
+
from ... import stream
|
|
9
|
+
|
|
10
|
+
class StreamServiceBase(abc.ABC):
|
|
11
|
+
|
|
12
|
+
@abc.abstractmethod
|
|
13
|
+
async def ListStreams(self, stream: 'grpclib.server.Stream[stream.v1.stream_pb2.ListStreamsRequest, stream.v1.stream_pb2.ListStreamsResponse]') -> None:
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
@abc.abstractmethod
|
|
17
|
+
async def AddStream(self, stream: 'grpclib.server.Stream[stream.v1.stream_pb2.AddStreamRequest, stream.v1.stream_pb2.AddStreamResponse]') -> None:
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
@abc.abstractmethod
|
|
21
|
+
async def GetStreamOptions(self, stream: 'grpclib.server.Stream[stream.v1.stream_pb2.GetStreamOptionsRequest, stream.v1.stream_pb2.GetStreamOptionsResponse]') -> None:
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
@abc.abstractmethod
|
|
25
|
+
async def SetStreamOptions(self, stream: 'grpclib.server.Stream[stream.v1.stream_pb2.SetStreamOptionsRequest, stream.v1.stream_pb2.SetStreamOptionsResponse]') -> None:
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
@abc.abstractmethod
|
|
29
|
+
async def RemoveStream(self, stream: 'grpclib.server.Stream[stream.v1.stream_pb2.RemoveStreamRequest, stream.v1.stream_pb2.RemoveStreamResponse]') -> None:
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]:
|
|
33
|
+
return {'/proto.stream.v1.StreamService/ListStreams': grpclib.const.Handler(self.ListStreams, grpclib.const.Cardinality.UNARY_UNARY, stream.v1.stream_pb2.ListStreamsRequest, stream.v1.stream_pb2.ListStreamsResponse), '/proto.stream.v1.StreamService/AddStream': grpclib.const.Handler(self.AddStream, grpclib.const.Cardinality.UNARY_UNARY, stream.v1.stream_pb2.AddStreamRequest, stream.v1.stream_pb2.AddStreamResponse), '/proto.stream.v1.StreamService/GetStreamOptions': grpclib.const.Handler(self.GetStreamOptions, grpclib.const.Cardinality.UNARY_UNARY, stream.v1.stream_pb2.GetStreamOptionsRequest, stream.v1.stream_pb2.GetStreamOptionsResponse), '/proto.stream.v1.StreamService/SetStreamOptions': grpclib.const.Handler(self.SetStreamOptions, grpclib.const.Cardinality.UNARY_UNARY, stream.v1.stream_pb2.SetStreamOptionsRequest, stream.v1.stream_pb2.SetStreamOptionsResponse), '/proto.stream.v1.StreamService/RemoveStream': grpclib.const.Handler(self.RemoveStream, grpclib.const.Cardinality.UNARY_UNARY, stream.v1.stream_pb2.RemoveStreamRequest, stream.v1.stream_pb2.RemoveStreamResponse)}
|
|
34
|
+
|
|
35
|
+
class UnimplementedStreamServiceBase(StreamServiceBase):
|
|
36
|
+
|
|
37
|
+
async def ListStreams(self, stream: 'grpclib.server.Stream[stream.v1.stream_pb2.ListStreamsRequest, stream.v1.stream_pb2.ListStreamsResponse]') -> None:
|
|
38
|
+
raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
|
|
39
|
+
|
|
40
|
+
async def AddStream(self, stream: 'grpclib.server.Stream[stream.v1.stream_pb2.AddStreamRequest, stream.v1.stream_pb2.AddStreamResponse]') -> None:
|
|
41
|
+
raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
|
|
42
|
+
|
|
43
|
+
async def GetStreamOptions(self, stream: 'grpclib.server.Stream[stream.v1.stream_pb2.GetStreamOptionsRequest, stream.v1.stream_pb2.GetStreamOptionsResponse]') -> None:
|
|
44
|
+
raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
|
|
45
|
+
|
|
46
|
+
async def SetStreamOptions(self, stream: 'grpclib.server.Stream[stream.v1.stream_pb2.SetStreamOptionsRequest, stream.v1.stream_pb2.SetStreamOptionsResponse]') -> None:
|
|
47
|
+
raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
|
|
48
|
+
|
|
49
|
+
async def RemoveStream(self, stream: 'grpclib.server.Stream[stream.v1.stream_pb2.RemoveStreamRequest, stream.v1.stream_pb2.RemoveStreamResponse]') -> None:
|
|
50
|
+
raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
|
|
51
|
+
|
|
52
|
+
class StreamServiceStub:
|
|
53
|
+
|
|
54
|
+
def __init__(self, channel: grpclib.client.Channel) -> None:
|
|
55
|
+
self.ListStreams = grpclib.client.UnaryUnaryMethod(channel, '/proto.stream.v1.StreamService/ListStreams', stream.v1.stream_pb2.ListStreamsRequest, stream.v1.stream_pb2.ListStreamsResponse)
|
|
56
|
+
self.AddStream = grpclib.client.UnaryUnaryMethod(channel, '/proto.stream.v1.StreamService/AddStream', stream.v1.stream_pb2.AddStreamRequest, stream.v1.stream_pb2.AddStreamResponse)
|
|
57
|
+
self.GetStreamOptions = grpclib.client.UnaryUnaryMethod(channel, '/proto.stream.v1.StreamService/GetStreamOptions', stream.v1.stream_pb2.GetStreamOptionsRequest, stream.v1.stream_pb2.GetStreamOptionsResponse)
|
|
58
|
+
self.SetStreamOptions = grpclib.client.UnaryUnaryMethod(channel, '/proto.stream.v1.StreamService/SetStreamOptions', stream.v1.stream_pb2.SetStreamOptionsRequest, stream.v1.stream_pb2.SetStreamOptionsResponse)
|
|
59
|
+
self.RemoveStream = grpclib.client.UnaryUnaryMethod(channel, '/proto.stream.v1.StreamService/RemoveStream', stream.v1.stream_pb2.RemoveStreamRequest, stream.v1.stream_pb2.RemoveStreamResponse)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""Generated protocol buffer code."""
|
|
2
|
+
from google.protobuf import descriptor as _descriptor
|
|
3
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
4
|
+
from google.protobuf import runtime_version as _runtime_version
|
|
5
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
6
|
+
from google.protobuf.internal import builder as _builder
|
|
7
|
+
_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 2, '', 'stream/v1/stream.proto')
|
|
8
|
+
_sym_db = _symbol_database.Default()
|
|
9
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16stream/v1/stream.proto\x12\x0fproto.stream.v1"\x14\n\x12ListStreamsRequest"+\n\x13ListStreamsResponse\x12\x14\n\x05names\x18\x01 \x03(\tR\x05names"&\n\x10AddStreamRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"\x13\n\x11AddStreamResponse")\n\x13RemoveStreamRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"\x16\n\x14RemoveStreamResponse":\n\nResolution\x12\x14\n\x05width\x18\x01 \x01(\x05R\x05width\x12\x16\n\x06height\x18\x02 \x01(\x05R\x06height"-\n\x17GetStreamOptionsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"Y\n\x18GetStreamOptionsResponse\x12=\n\x0bresolutions\x18\x01 \x03(\x0b2\x1b.proto.stream.v1.ResolutionR\x0bresolutions"j\n\x17SetStreamOptionsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\nresolution\x18\x02 \x01(\x0b2\x1b.proto.stream.v1.ResolutionR\nresolution"\x1a\n\x18SetStreamOptionsResponse2\xec\x03\n\rStreamService\x12X\n\x0bListStreams\x12#.proto.stream.v1.ListStreamsRequest\x1a$.proto.stream.v1.ListStreamsResponse\x12R\n\tAddStream\x12!.proto.stream.v1.AddStreamRequest\x1a".proto.stream.v1.AddStreamResponse\x12g\n\x10GetStreamOptions\x12(.proto.stream.v1.GetStreamOptionsRequest\x1a).proto.stream.v1.GetStreamOptionsResponse\x12g\n\x10SetStreamOptions\x12(.proto.stream.v1.SetStreamOptionsRequest\x1a).proto.stream.v1.SetStreamOptionsResponse\x12[\n\x0cRemoveStream\x12$.proto.stream.v1.RemoveStreamRequest\x1a%.proto.stream.v1.RemoveStreamResponseB.Z,github.com/edaniels/gostream/proto/stream/v1b\x06proto3')
|
|
10
|
+
_globals = globals()
|
|
11
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
12
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'stream.v1.stream_pb2', _globals)
|
|
13
|
+
if not _descriptor._USE_C_DESCRIPTORS:
|
|
14
|
+
_globals['DESCRIPTOR']._loaded_options = None
|
|
15
|
+
_globals['DESCRIPTOR']._serialized_options = b'Z,github.com/edaniels/gostream/proto/stream/v1'
|
|
16
|
+
_globals['_LISTSTREAMSREQUEST']._serialized_start = 43
|
|
17
|
+
_globals['_LISTSTREAMSREQUEST']._serialized_end = 63
|
|
18
|
+
_globals['_LISTSTREAMSRESPONSE']._serialized_start = 65
|
|
19
|
+
_globals['_LISTSTREAMSRESPONSE']._serialized_end = 108
|
|
20
|
+
_globals['_ADDSTREAMREQUEST']._serialized_start = 110
|
|
21
|
+
_globals['_ADDSTREAMREQUEST']._serialized_end = 148
|
|
22
|
+
_globals['_ADDSTREAMRESPONSE']._serialized_start = 150
|
|
23
|
+
_globals['_ADDSTREAMRESPONSE']._serialized_end = 169
|
|
24
|
+
_globals['_REMOVESTREAMREQUEST']._serialized_start = 171
|
|
25
|
+
_globals['_REMOVESTREAMREQUEST']._serialized_end = 212
|
|
26
|
+
_globals['_REMOVESTREAMRESPONSE']._serialized_start = 214
|
|
27
|
+
_globals['_REMOVESTREAMRESPONSE']._serialized_end = 236
|
|
28
|
+
_globals['_RESOLUTION']._serialized_start = 238
|
|
29
|
+
_globals['_RESOLUTION']._serialized_end = 296
|
|
30
|
+
_globals['_GETSTREAMOPTIONSREQUEST']._serialized_start = 298
|
|
31
|
+
_globals['_GETSTREAMOPTIONSREQUEST']._serialized_end = 343
|
|
32
|
+
_globals['_GETSTREAMOPTIONSRESPONSE']._serialized_start = 345
|
|
33
|
+
_globals['_GETSTREAMOPTIONSRESPONSE']._serialized_end = 434
|
|
34
|
+
_globals['_SETSTREAMOPTIONSREQUEST']._serialized_start = 436
|
|
35
|
+
_globals['_SETSTREAMOPTIONSREQUEST']._serialized_end = 542
|
|
36
|
+
_globals['_SETSTREAMOPTIONSRESPONSE']._serialized_start = 544
|
|
37
|
+
_globals['_SETSTREAMOPTIONSRESPONSE']._serialized_end = 570
|
|
38
|
+
_globals['_STREAMSERVICE']._serialized_start = 573
|
|
39
|
+
_globals['_STREAMSERVICE']._serialized_end = 1065
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""
|
|
2
|
+
@generated by mypy-protobuf. Do not edit manually!
|
|
3
|
+
isort:skip_file
|
|
4
|
+
"""
|
|
5
|
+
import builtins
|
|
6
|
+
import collections.abc
|
|
7
|
+
import google.protobuf.descriptor
|
|
8
|
+
import google.protobuf.internal.containers
|
|
9
|
+
import google.protobuf.message
|
|
10
|
+
import typing
|
|
11
|
+
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
|
12
|
+
|
|
13
|
+
@typing.final
|
|
14
|
+
class ListStreamsRequest(google.protobuf.message.Message):
|
|
15
|
+
"""ListStreamsRequest requests all streams registered."""
|
|
16
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
17
|
+
|
|
18
|
+
def __init__(self) -> None:
|
|
19
|
+
...
|
|
20
|
+
global___ListStreamsRequest = ListStreamsRequest
|
|
21
|
+
|
|
22
|
+
@typing.final
|
|
23
|
+
class ListStreamsResponse(google.protobuf.message.Message):
|
|
24
|
+
"""A ListStreamsResponse details streams registered."""
|
|
25
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
26
|
+
NAMES_FIELD_NUMBER: builtins.int
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def names(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
|
|
30
|
+
...
|
|
31
|
+
|
|
32
|
+
def __init__(self, *, names: collections.abc.Iterable[builtins.str] | None=...) -> None:
|
|
33
|
+
...
|
|
34
|
+
|
|
35
|
+
def ClearField(self, field_name: typing.Literal['names', b'names']) -> None:
|
|
36
|
+
...
|
|
37
|
+
global___ListStreamsResponse = ListStreamsResponse
|
|
38
|
+
|
|
39
|
+
@typing.final
|
|
40
|
+
class AddStreamRequest(google.protobuf.message.Message):
|
|
41
|
+
"""A AddStreamRequest requests the given stream be added to the connection."""
|
|
42
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
43
|
+
NAME_FIELD_NUMBER: builtins.int
|
|
44
|
+
name: builtins.str
|
|
45
|
+
|
|
46
|
+
def __init__(self, *, name: builtins.str=...) -> None:
|
|
47
|
+
...
|
|
48
|
+
|
|
49
|
+
def ClearField(self, field_name: typing.Literal['name', b'name']) -> None:
|
|
50
|
+
...
|
|
51
|
+
global___AddStreamRequest = AddStreamRequest
|
|
52
|
+
|
|
53
|
+
@typing.final
|
|
54
|
+
class AddStreamResponse(google.protobuf.message.Message):
|
|
55
|
+
"""AddStreamResponse is returned after a successful AddStreamRequest."""
|
|
56
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
57
|
+
|
|
58
|
+
def __init__(self) -> None:
|
|
59
|
+
...
|
|
60
|
+
global___AddStreamResponse = AddStreamResponse
|
|
61
|
+
|
|
62
|
+
@typing.final
|
|
63
|
+
class RemoveStreamRequest(google.protobuf.message.Message):
|
|
64
|
+
"""A RemoveStreamRequest requests the given stream be removed from the connection."""
|
|
65
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
66
|
+
NAME_FIELD_NUMBER: builtins.int
|
|
67
|
+
name: builtins.str
|
|
68
|
+
|
|
69
|
+
def __init__(self, *, name: builtins.str=...) -> None:
|
|
70
|
+
...
|
|
71
|
+
|
|
72
|
+
def ClearField(self, field_name: typing.Literal['name', b'name']) -> None:
|
|
73
|
+
...
|
|
74
|
+
global___RemoveStreamRequest = RemoveStreamRequest
|
|
75
|
+
|
|
76
|
+
@typing.final
|
|
77
|
+
class RemoveStreamResponse(google.protobuf.message.Message):
|
|
78
|
+
"""RemoveStreamResponse is returned after a successful RemoveStreamRequest."""
|
|
79
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
80
|
+
|
|
81
|
+
def __init__(self) -> None:
|
|
82
|
+
...
|
|
83
|
+
global___RemoveStreamResponse = RemoveStreamResponse
|
|
84
|
+
|
|
85
|
+
@typing.final
|
|
86
|
+
class Resolution(google.protobuf.message.Message):
|
|
87
|
+
"""Resolution details the width and height of a stream."""
|
|
88
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
89
|
+
WIDTH_FIELD_NUMBER: builtins.int
|
|
90
|
+
HEIGHT_FIELD_NUMBER: builtins.int
|
|
91
|
+
width: builtins.int
|
|
92
|
+
height: builtins.int
|
|
93
|
+
|
|
94
|
+
def __init__(self, *, width: builtins.int=..., height: builtins.int=...) -> None:
|
|
95
|
+
...
|
|
96
|
+
|
|
97
|
+
def ClearField(self, field_name: typing.Literal['height', b'height', 'width', b'width']) -> None:
|
|
98
|
+
...
|
|
99
|
+
global___Resolution = Resolution
|
|
100
|
+
|
|
101
|
+
@typing.final
|
|
102
|
+
class GetStreamOptionsRequest(google.protobuf.message.Message):
|
|
103
|
+
"""GetStreamOptionsRequest requests the options for a particular stream."""
|
|
104
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
105
|
+
NAME_FIELD_NUMBER: builtins.int
|
|
106
|
+
name: builtins.str
|
|
107
|
+
|
|
108
|
+
def __init__(self, *, name: builtins.str=...) -> None:
|
|
109
|
+
...
|
|
110
|
+
|
|
111
|
+
def ClearField(self, field_name: typing.Literal['name', b'name']) -> None:
|
|
112
|
+
...
|
|
113
|
+
global___GetStreamOptionsRequest = GetStreamOptionsRequest
|
|
114
|
+
|
|
115
|
+
@typing.final
|
|
116
|
+
class GetStreamOptionsResponse(google.protobuf.message.Message):
|
|
117
|
+
"""GetStreamOptionsResponse details the options for a particular stream."""
|
|
118
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
119
|
+
RESOLUTIONS_FIELD_NUMBER: builtins.int
|
|
120
|
+
|
|
121
|
+
@property
|
|
122
|
+
def resolutions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Resolution]:
|
|
123
|
+
...
|
|
124
|
+
|
|
125
|
+
def __init__(self, *, resolutions: collections.abc.Iterable[global___Resolution] | None=...) -> None:
|
|
126
|
+
...
|
|
127
|
+
|
|
128
|
+
def ClearField(self, field_name: typing.Literal['resolutions', b'resolutions']) -> None:
|
|
129
|
+
...
|
|
130
|
+
global___GetStreamOptionsResponse = GetStreamOptionsResponse
|
|
131
|
+
|
|
132
|
+
@typing.final
|
|
133
|
+
class SetStreamOptionsRequest(google.protobuf.message.Message):
|
|
134
|
+
"""SetStreamOptionsRequest sets the options for a particular stream."""
|
|
135
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
136
|
+
NAME_FIELD_NUMBER: builtins.int
|
|
137
|
+
RESOLUTION_FIELD_NUMBER: builtins.int
|
|
138
|
+
name: builtins.str
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def resolution(self) -> global___Resolution:
|
|
142
|
+
...
|
|
143
|
+
|
|
144
|
+
def __init__(self, *, name: builtins.str=..., resolution: global___Resolution | None=...) -> None:
|
|
145
|
+
...
|
|
146
|
+
|
|
147
|
+
def HasField(self, field_name: typing.Literal['resolution', b'resolution']) -> builtins.bool:
|
|
148
|
+
...
|
|
149
|
+
|
|
150
|
+
def ClearField(self, field_name: typing.Literal['name', b'name', 'resolution', b'resolution']) -> None:
|
|
151
|
+
...
|
|
152
|
+
global___SetStreamOptionsRequest = SetStreamOptionsRequest
|
|
153
|
+
|
|
154
|
+
@typing.final
|
|
155
|
+
class SetStreamOptionsResponse(google.protobuf.message.Message):
|
|
156
|
+
"""SetStreamOptionsResponse is returned after a successful SetStreamOptionsRequest."""
|
|
157
|
+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
158
|
+
|
|
159
|
+
def __init__(self) -> None:
|
|
160
|
+
...
|
|
161
|
+
global___SetStreamOptionsResponse = SetStreamOptionsResponse
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Generated protocol buffer code."""
|
|
2
|
+
from google.protobuf import descriptor as _descriptor
|
|
3
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
4
|
+
from google.protobuf import runtime_version as _runtime_version
|
|
5
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
6
|
+
from google.protobuf.internal import builder as _builder
|
|
7
|
+
_runtime_version.ValidateProtobufRuntimeVersion(_runtime_version.Domain.PUBLIC, 5, 29, 2, '', 'tagger/v1/tagger.proto')
|
|
8
|
+
_sym_db = _symbol_database.Default()
|
|
9
|
+
from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
|
|
10
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16tagger/v1/tagger.proto\x12\ttagger.v1\x1a google/protobuf/descriptor.proto:3\n\x04tags\x12\x1d.google.protobuf.FieldOptions\x18\xc3\xe03 \x01(\tR\x04tags:>\n\noneof_tags\x12\x1d.google.protobuf.OneofOptions\x18\xc3\xe03 \x01(\tR\toneofTagsB4Z2github.com/srikrsna/protoc-gen-gotag/tagger;taggerb\x06proto3')
|
|
11
|
+
_globals = globals()
|
|
12
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
13
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'tagger.v1.tagger_pb2', _globals)
|
|
14
|
+
if not _descriptor._USE_C_DESCRIPTORS:
|
|
15
|
+
_globals['DESCRIPTOR']._loaded_options = None
|
|
16
|
+
_globals['DESCRIPTOR']._serialized_options = b'Z2github.com/srikrsna/protoc-gen-gotag/tagger;tagger'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""
|
|
2
|
+
@generated by mypy-protobuf. Do not edit manually!
|
|
3
|
+
isort:skip_file
|
|
4
|
+
"""
|
|
5
|
+
import builtins
|
|
6
|
+
import google.protobuf.descriptor
|
|
7
|
+
import google.protobuf.descriptor_pb2
|
|
8
|
+
import google.protobuf.internal.extension_dict
|
|
9
|
+
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
|
10
|
+
TAGS_FIELD_NUMBER: builtins.int
|
|
11
|
+
ONEOF_TAGS_FIELD_NUMBER: builtins.int
|
|
12
|
+
tags: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.FieldOptions, builtins.str]
|
|
13
|
+
'Multiple Tags can be spcified.'
|
|
14
|
+
oneof_tags: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.OneofOptions, builtins.str]
|
|
15
|
+
'Multiple Tags can be spcified.'
|
viam/logging.py
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import logging
|
|
3
|
+
import sys
|
|
4
|
+
from copy import copy
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from logging import DEBUG, ERROR, FATAL, INFO, WARN, WARNING # noqa: F401
|
|
7
|
+
from threading import Lock, Thread
|
|
8
|
+
from typing import TYPE_CHECKING, Dict, Iterable, List, Optional, Union
|
|
9
|
+
|
|
10
|
+
from grpclib.exceptions import StreamTerminatedError
|
|
11
|
+
|
|
12
|
+
import viam
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from .robot.client import RobotClient
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
LOG_LEVEL = INFO
|
|
19
|
+
LOGGERS: Dict[str, logging.Logger] = {}
|
|
20
|
+
_MODULE_PARENT: Optional["RobotClient"] = None
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class _SingletonEventLoopThread:
|
|
24
|
+
_instance = None
|
|
25
|
+
_lock = Lock()
|
|
26
|
+
_ready_event = asyncio.Event()
|
|
27
|
+
_loop: Union[asyncio.AbstractEventLoop, None]
|
|
28
|
+
_thread: Thread
|
|
29
|
+
|
|
30
|
+
def __new__(cls):
|
|
31
|
+
# Ensure singleton precondition
|
|
32
|
+
if cls._instance is None:
|
|
33
|
+
with cls._lock:
|
|
34
|
+
if cls._instance is None:
|
|
35
|
+
cls._instance = super(_SingletonEventLoopThread, cls).__new__(cls)
|
|
36
|
+
cls._instance._loop = None
|
|
37
|
+
cls._instance._thread = Thread(target=cls._instance._run)
|
|
38
|
+
cls._instance._thread.start()
|
|
39
|
+
return cls._instance
|
|
40
|
+
|
|
41
|
+
def _run(self):
|
|
42
|
+
self._loop = asyncio.new_event_loop()
|
|
43
|
+
asyncio.set_event_loop(self._loop)
|
|
44
|
+
self._ready_event.set()
|
|
45
|
+
self._loop.run_forever()
|
|
46
|
+
|
|
47
|
+
def stop(self):
|
|
48
|
+
if self._loop is not None:
|
|
49
|
+
self._loop.call_soon_threadsafe(self._loop.stop)
|
|
50
|
+
self._thread.join()
|
|
51
|
+
|
|
52
|
+
def get_loop(self):
|
|
53
|
+
if self._loop is None:
|
|
54
|
+
raise RuntimeError("Event loop is None. Did you call .start() and .wait_until_ready()?")
|
|
55
|
+
return self._loop
|
|
56
|
+
|
|
57
|
+
async def wait_until_ready(self):
|
|
58
|
+
await self._ready_event.wait()
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class _ModuleHandler(logging.Handler):
|
|
62
|
+
_parent: "RobotClient"
|
|
63
|
+
_logger: logging.Logger
|
|
64
|
+
_worker: _SingletonEventLoopThread
|
|
65
|
+
|
|
66
|
+
def __init__(self, parent: "RobotClient"):
|
|
67
|
+
super().__init__()
|
|
68
|
+
self._parent = parent
|
|
69
|
+
self._logger = logging.getLogger("ModuleLogger")
|
|
70
|
+
addHandlers(self._logger, True)
|
|
71
|
+
self._logger.setLevel(self.level)
|
|
72
|
+
self._worker = _SingletonEventLoopThread()
|
|
73
|
+
|
|
74
|
+
def setLevel(self, level: Union[int, str]) -> None:
|
|
75
|
+
self._logger.setLevel(level)
|
|
76
|
+
return super().setLevel(level)
|
|
77
|
+
|
|
78
|
+
async def handle_task_result(self, task: asyncio.Task):
|
|
79
|
+
try:
|
|
80
|
+
_ = task.result()
|
|
81
|
+
except (asyncio.CancelledError, asyncio.InvalidStateError, StreamTerminatedError):
|
|
82
|
+
pass
|
|
83
|
+
|
|
84
|
+
def emit(self, record: logging.LogRecord):
|
|
85
|
+
assert isinstance(record, logging.LogRecord)
|
|
86
|
+
# Fully qualified name of form "{API triplet}/{name}", e.g. "rdk:component:arm/myarm"
|
|
87
|
+
name = record.name.replace(".", "/")
|
|
88
|
+
message = f"{record.filename}:{record.lineno}\t{record.getMessage()}"
|
|
89
|
+
stack = f"exc_info: {record.exc_info}, exc_text: {record.exc_text}, stack_info: {record.stack_info}"
|
|
90
|
+
time = datetime.fromtimestamp(record.created)
|
|
91
|
+
|
|
92
|
+
try:
|
|
93
|
+
loop = self._worker.get_loop()
|
|
94
|
+
asyncio.run_coroutine_threadsafe(
|
|
95
|
+
self._asynchronously_emit(record, name, message, stack, time),
|
|
96
|
+
loop,
|
|
97
|
+
)
|
|
98
|
+
except Exception as err:
|
|
99
|
+
# If the module log fails, log using stdout/stderr handlers
|
|
100
|
+
self._logger.error(f"ModuleLogger failed for {record.name} - {err}")
|
|
101
|
+
self._logger.log(record.levelno, message)
|
|
102
|
+
|
|
103
|
+
async def _asynchronously_emit(self, record: logging.LogRecord, name: str, message: str, stack: str, time: datetime):
|
|
104
|
+
await self._worker.wait_until_ready()
|
|
105
|
+
task = self._worker.get_loop().create_task(
|
|
106
|
+
self._parent.log(name, record.levelname, time, message, stack),
|
|
107
|
+
name=f"{viam._TASK_PREFIX}-LOG-{record.created}",
|
|
108
|
+
)
|
|
109
|
+
task.add_done_callback(lambda t: asyncio.run_coroutine_threadsafe(self.handle_task_result(t), self._worker.get_loop()))
|
|
110
|
+
|
|
111
|
+
def close(self):
|
|
112
|
+
self._worker.stop()
|
|
113
|
+
super().close()
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class _ColorFormatter(logging.Formatter):
|
|
117
|
+
MAPPING = {
|
|
118
|
+
"DEBUG": 37, # white
|
|
119
|
+
"INFO": 36, # cyan
|
|
120
|
+
"WARNING": 33, # yellow
|
|
121
|
+
"ERROR": 31, # red
|
|
122
|
+
"CRITICAL": 41, # white on red bg
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
def __init__(self, pattern):
|
|
126
|
+
logging.Formatter.__init__(self, pattern)
|
|
127
|
+
|
|
128
|
+
def format(self, record):
|
|
129
|
+
colored_record = copy(record)
|
|
130
|
+
levelname = colored_record.levelname
|
|
131
|
+
seq = self.MAPPING.get(levelname, 37) # default white
|
|
132
|
+
colored_levelname = f"\x1b[33;{seq}m{levelname}\x1b[0m"
|
|
133
|
+
colored_record.levelname = colored_levelname
|
|
134
|
+
return super().format(colored_record)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def getLogger(name: str) -> logging.Logger:
|
|
138
|
+
logger = LOGGERS.get(name)
|
|
139
|
+
if logger:
|
|
140
|
+
return logger
|
|
141
|
+
|
|
142
|
+
logger = logging.getLogger(name)
|
|
143
|
+
logger.setLevel(LOG_LEVEL)
|
|
144
|
+
|
|
145
|
+
addHandlers(logger)
|
|
146
|
+
|
|
147
|
+
LOGGERS[name] = logger
|
|
148
|
+
return logger
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def addHandlers(logger: logging.Logger, use_default_handlers=False):
|
|
152
|
+
_addHandlers([logger], use_default_handlers)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def update_log_level(logger: logging.Logger, level: Union[int, str]):
|
|
156
|
+
if level == "":
|
|
157
|
+
level = LOG_LEVEL
|
|
158
|
+
logger.setLevel(level)
|
|
159
|
+
for handler in logger.handlers:
|
|
160
|
+
handler.setLevel(level)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _addHandlers(loggers: Iterable[logging.Logger], use_default_handlers=False):
|
|
164
|
+
format = _ColorFormatter("%(asctime)s\t\t" + "%(levelname)s\t" + "%(name)s (%(filename)s:%(lineno)d)\t" + "%(message)s\t")
|
|
165
|
+
|
|
166
|
+
handlers: List[logging.Handler] = []
|
|
167
|
+
|
|
168
|
+
std_handler = logging.StreamHandler(stream=sys.stdout)
|
|
169
|
+
std_handler.setFormatter(format)
|
|
170
|
+
# filter out logs at error level or above
|
|
171
|
+
std_handler.setLevel(LOG_LEVEL)
|
|
172
|
+
std_handler.addFilter(filter=lambda record: (record.levelno < ERROR))
|
|
173
|
+
|
|
174
|
+
err_handler = logging.StreamHandler(stream=sys.stderr)
|
|
175
|
+
err_handler.setFormatter(format)
|
|
176
|
+
# filter out logs below error level
|
|
177
|
+
err_handler.setLevel(max(ERROR, LOG_LEVEL))
|
|
178
|
+
|
|
179
|
+
if _MODULE_PARENT is not None and not use_default_handlers:
|
|
180
|
+
mod_handler = _ModuleHandler(_MODULE_PARENT)
|
|
181
|
+
mod_handler.setFormatter(format)
|
|
182
|
+
mod_handler.setLevel(LOG_LEVEL)
|
|
183
|
+
handlers = [mod_handler]
|
|
184
|
+
else:
|
|
185
|
+
handlers = [std_handler, err_handler]
|
|
186
|
+
|
|
187
|
+
for logger in loggers:
|
|
188
|
+
logger.handlers.clear()
|
|
189
|
+
if "viam.sessions_client" in LOGGERS and LOGGERS["viam.sessions_client"] == logger:
|
|
190
|
+
logger.addHandler(std_handler)
|
|
191
|
+
logger.addHandler(err_handler)
|
|
192
|
+
else:
|
|
193
|
+
for h in handlers:
|
|
194
|
+
logger.addHandler(h)
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def setParent(parent: "RobotClient"):
|
|
198
|
+
global _MODULE_PARENT
|
|
199
|
+
_MODULE_PARENT = parent
|
|
200
|
+
_addHandlers(LOGGERS.values())
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def setLevel(level: int):
|
|
204
|
+
global LOG_LEVEL
|
|
205
|
+
LOG_LEVEL = level
|
|
206
|
+
for logger in LOGGERS.values():
|
|
207
|
+
logger.setLevel(LOG_LEVEL)
|
|
208
|
+
_addHandlers(LOGGERS.values())
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def silence():
|
|
212
|
+
setLevel(FATAL + 1)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def shutdown():
|
|
216
|
+
logging.shutdown()
|
viam/media/__init__.py
ADDED
|
File without changes
|
viam/media/audio.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from viam.proto.component.audioinput import AudioChunk, AudioChunkInfo
|
|
4
|
+
from viam.streams import Stream, StreamReader
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class Audio:
|
|
9
|
+
"""A block of audio data containing information about the block and the audio data"""
|
|
10
|
+
|
|
11
|
+
info: AudioChunkInfo
|
|
12
|
+
chunk: AudioChunk
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
AudioReader = StreamReader[Audio]
|
|
16
|
+
AudioStream = Stream[Audio]
|
|
File without changes
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from io import BytesIO
|
|
2
|
+
|
|
3
|
+
from PIL import Image
|
|
4
|
+
|
|
5
|
+
from ....media.video import CameraMimeType, ViamImage
|
|
6
|
+
from .viam_rgba_plugin import RGBA_FORMAT_LABEL
|
|
7
|
+
|
|
8
|
+
# Formats that are supported by PIL
|
|
9
|
+
LIBRARY_SUPPORTED_FORMATS = ["JPEG", "PNG", RGBA_FORMAT_LABEL]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def viam_to_pil_image(image: ViamImage) -> Image.Image:
|
|
13
|
+
"""
|
|
14
|
+
Convert a ViamImage to a PIL.Image.
|
|
15
|
+
|
|
16
|
+
In order to use this function, Pillow must be installed.
|
|
17
|
+
https://pillow.readthedocs.io/
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
image (ViamImage): The image to convert.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
Image.Image: The resulting PIL.Image
|
|
24
|
+
"""
|
|
25
|
+
return Image.open(BytesIO(image.data), formats=LIBRARY_SUPPORTED_FORMATS)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def pil_to_viam_image(image: Image.Image, mime_type: CameraMimeType) -> ViamImage:
|
|
29
|
+
"""
|
|
30
|
+
Convert a PIL.Image to a ViamImage.
|
|
31
|
+
|
|
32
|
+
In order to use this function, Pillow must be installed.
|
|
33
|
+
https://pillow.readthedocs.io/
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
image (Image.Image): The image to convert.
|
|
37
|
+
mime_type (CameraMimeType): The mime type to convert the image to.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
ViamImage: The resulting ViamImage
|
|
41
|
+
"""
|
|
42
|
+
if mime_type.name in LIBRARY_SUPPORTED_FORMATS:
|
|
43
|
+
buf = BytesIO()
|
|
44
|
+
if image.mode == "RGBA" and mime_type == CameraMimeType.JPEG:
|
|
45
|
+
image = image.convert("RGB")
|
|
46
|
+
image.save(buf, format=mime_type.name)
|
|
47
|
+
data = buf.getvalue()
|
|
48
|
+
else:
|
|
49
|
+
raise ValueError(f"Cannot encode image to {mime_type}")
|
|
50
|
+
|
|
51
|
+
return ViamImage(data, mime_type)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from typing import ClassVar, Tuple
|
|
2
|
+
|
|
3
|
+
from PIL import Image
|
|
4
|
+
from PIL.ImageFile import ImageFile, PyDecoder, PyEncoder, _safe_read # type: ignore -- (njooma) this exists, manually checked
|
|
5
|
+
from PIL.ImageFile import _save as image_save # type: ignore -- (njooma) this exists, manually checked
|
|
6
|
+
|
|
7
|
+
from ...viam_rgba import RGBA_FORMAT_LABEL, RGBA_HEADER_LENGTH, RGBA_MAGIC_NUMBER
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _accept(prefix: str):
|
|
11
|
+
return prefix[:4] == RGBA_MAGIC_NUMBER
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class RGBAEncoder(PyEncoder):
|
|
15
|
+
ENCODER_NAME = RGBA_FORMAT_LABEL
|
|
16
|
+
|
|
17
|
+
_pushes_fd = True
|
|
18
|
+
|
|
19
|
+
def encode(self, bufsize): # pyright: ignore [reportIncompatibleMethodOverride]
|
|
20
|
+
data_arr = bytearray()
|
|
21
|
+
width, height = self.im.size
|
|
22
|
+
for y in range(height):
|
|
23
|
+
for x in range(width):
|
|
24
|
+
data_arr.extend(self.im.getpixel((x, y)))
|
|
25
|
+
data = bytes(data_arr)
|
|
26
|
+
|
|
27
|
+
return len(data), 0, data
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _save_rgba(img, fp, filename):
|
|
31
|
+
width, height = img.size
|
|
32
|
+
fp.write(RGBA_MAGIC_NUMBER)
|
|
33
|
+
fp.write(width.to_bytes(4, byteorder="big"))
|
|
34
|
+
fp.write(height.to_bytes(4, byteorder="big"))
|
|
35
|
+
|
|
36
|
+
image_save(img, fp, [(RGBAEncoder.ENCODER_NAME, (0, 0, width, height), 0, ("RGBA", 0, 1))])
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class RGBAImage(ImageFile):
|
|
40
|
+
format: ClassVar[str] = RGBA_FORMAT_LABEL # pyright: ignore [reportIncompatibleVariableOverride]
|
|
41
|
+
format_description = "Viam's Raw RGBA Format"
|
|
42
|
+
|
|
43
|
+
def _open(self):
|
|
44
|
+
header = self.fp.read(RGBA_HEADER_LENGTH)
|
|
45
|
+
|
|
46
|
+
width = int.from_bytes(header[4:8], "big")
|
|
47
|
+
height = int.from_bytes(header[8:12], "big")
|
|
48
|
+
self._size = width, height
|
|
49
|
+
if hasattr(self, "_mode"):
|
|
50
|
+
self._mode = "RGBA"
|
|
51
|
+
else:
|
|
52
|
+
self.mode = "RGBA" # type: ignore -- (njooma) newer versions of PIL hide this behind _mode, which is why we check
|
|
53
|
+
|
|
54
|
+
# data descriptor
|
|
55
|
+
self.tile = [(RGBAEncoder.ENCODER_NAME, (0, 0, width, height), RGBA_HEADER_LENGTH, (self.mode, 0, 1))]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class RGBADecoder(PyDecoder):
|
|
59
|
+
_pulls_fd = True
|
|
60
|
+
|
|
61
|
+
def decode(self, buffer) -> Tuple[int, int]:
|
|
62
|
+
width, height = self.im.size
|
|
63
|
+
self.set_as_raw(_safe_read(self.fd, width * height * 4))
|
|
64
|
+
return -1, 0
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# Register Viam's custom RGBA format so that it can be read using Image.open
|
|
68
|
+
Image.register_open(RGBAImage.format, RGBAImage, _accept)
|
|
69
|
+
Image.register_save(RGBAImage.format, _save_rgba)
|
|
70
|
+
Image.register_mime(RGBAImage.format, "image/vnd.viam.rgba")
|
|
71
|
+
Image.register_extension(RGBAImage.format, ".viam.rgba")
|
|
72
|
+
Image.register_encoder(RGBAEncoder.ENCODER_NAME, RGBAEncoder)
|
|
73
|
+
Image.register_decoder(RGBA_FORMAT_LABEL, RGBADecoder)
|
viam/media/viam_rgba.py
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Viam uses a special header prepended to raw RGBA data. The header is composed of a
|
|
2
|
+
# 4-byte magic number followed by a 4-byte line of the width as a uint32 number
|
|
3
|
+
# and another for the height. Credit to Ben Zotto for inventing this formulation
|
|
4
|
+
# https://bzotto.medium.com/introducing-the-rgba-bitmap-file-format-4a8a94329e2c
|
|
5
|
+
|
|
6
|
+
RGBA_MAGIC_NUMBER = bytes("RGBA", "utf-8")
|
|
7
|
+
|
|
8
|
+
RGBA_FORMAT_LABEL = "VIAM_RGBA"
|
|
9
|
+
|
|
10
|
+
RGBA_HEADER_LENGTH = 12
|