diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml
index 6e8c6cc83..173d41864 100644
--- a/doc/dependency_decisions.yml
+++ b/doc/dependency_decisions.yml
@@ -94,7 +94,7 @@
:when: 2026-08-12 00:00:00.000000000 Z
- - :approve
- googleapis-common-protos
- - :who: njooma
- :why: Apache 2.0
- :versions: []
- :when: 2026-09-10 22:09:58.590402000 Z
+ - :who: npmenard
+ :why: Apache-2.0
+ :versions: ['1.75.3']
+ :when: 2026-09-04 00:00:00.000000000 Z
diff --git a/docs/examples/example.ipynb b/docs/examples/example.ipynb
index 05e6ab204..b62968903 100644
--- a/docs/examples/example.ipynb
+++ b/docs/examples/example.ipynb
@@ -585,6 +585,15 @@
" async def get_3d_models(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> Mapping[str, Mesh]:\n",
" raise NotImplementedError()\n",
"\n",
+ " async def set_manual_mode(self, manual_mode: bool, enabled_for: int = 0, extra: Optional[Dict[str, Any]] = None, **kwargs):\n",
+ " raise NotImplementedError()\n",
+ "\n",
+ " async def get_manual_mode(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> bool:\n",
+ " raise NotImplementedError()\n",
+ "\n",
+ " async def get_properties(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> Arm.Properties:\n",
+ " return Arm.Properties()\n",
+ "\n",
" async def stop(self, extra: Optional[Dict[str, Any]] = None, **kwargs):\n",
" self.is_stopped = True\n",
"\n",
diff --git a/docs/examples/my_cool_arm.py b/docs/examples/my_cool_arm.py
index b94485992..0fd940c86 100644
--- a/docs/examples/my_cool_arm.py
+++ b/docs/examples/my_cool_arm.py
@@ -122,6 +122,17 @@ async def get_3d_models(self, extra: Optional[Dict[str, Any]] = None, **kwargs)
# Return the 3D meshes for this arm, keyed by name. This arm has none.
return {}
+ async def set_manual_mode(self, manual_mode: bool, enabled_for: int = 0, extra: Optional[Dict[str, Any]] = None, **kwargs):
+ # This arm does not support manual mode.
+ raise NotImplementedError()
+
+ async def get_manual_mode(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> bool:
+ # This arm does not support manual mode.
+ raise NotImplementedError()
+
+ async def get_properties(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> Arm.Properties:
+ return Arm.Properties(support_manual_mode=False, support_cartesian_commands=True)
+
async def stop(self, extra: Optional[Dict[str, Any]] = None, **kwargs):
self.is_stopped = True
diff --git a/examples/complex_module/src/arm/my_arm.py b/examples/complex_module/src/arm/my_arm.py
index ee9a5d28c..cae773c06 100644
--- a/examples/complex_module/src/arm/my_arm.py
+++ b/examples/complex_module/src/arm/my_arm.py
@@ -126,6 +126,17 @@ async def get_3d_models(self, extra: Optional[Dict[str, Any]] = None, **kwargs)
# This arm has no meshes to report.
return {}
+ async def set_manual_mode(self, manual_mode: bool, enabled_for: int = 0, extra: Optional[Dict[str, Any]] = None, **kwargs):
+ # This arm does not support manual mode.
+ raise NotImplementedError()
+
+ async def get_manual_mode(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> bool:
+ # This arm does not support manual mode.
+ raise NotImplementedError()
+
+ async def get_properties(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> Arm.Properties:
+ return Arm.Properties(support_manual_mode=False, support_cartesian_commands=True)
+
async def stop(self, extra: Optional[Dict[str, Any]] = None, **kwargs):
self.is_stopped = True
diff --git a/examples/server/v1/components.py b/examples/server/v1/components.py
index 679ed3571..cf3b8be68 100644
--- a/examples/server/v1/components.py
+++ b/examples/server/v1/components.py
@@ -109,6 +109,15 @@ async def move_through_joint_positions(
async def get_3d_models(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> Mapping[str, Mesh]:
return {}
+ async def set_manual_mode(self, manual_mode: bool, enabled_for: int = 0, extra: Optional[Dict[str, Any]] = None, **kwargs):
+ raise NotImplementedError()
+
+ async def get_manual_mode(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> bool:
+ raise NotImplementedError()
+
+ async def get_properties(self, extra: Optional[Dict[str, Any]] = None, **kwargs) -> Arm.Properties:
+ return Arm.Properties(support_manual_mode=False, support_cartesian_commands=True)
+
async def stop(self, extra: Optional[Dict[str, Any]] = None, **kwargs):
self.is_stopped = True
diff --git a/src/viam/components/arm/arm.py b/src/viam/components/arm/arm.py
index 501c16c7c..a7cd61d45 100644
--- a/src/viam/components/arm/arm.py
+++ b/src/viam/components/arm/arm.py
@@ -1,8 +1,9 @@
import abc
-from typing import Any, Dict, Final, List, Mapping, Optional
+from typing import Any, Dict, Final, List, Mapping, Optional, TypeAlias
from viam.components import KinematicsReturn
from viam.components.component_base import ComponentBase
+from viam.proto.component.arm import GetPropertiesResponse
from viam.resource.types import API, RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT
from . import JointPositions, Mesh, MoveOptions, Pose
@@ -31,6 +32,8 @@ class Arm(ComponentBase):
For more information, see `Arm component `_.
"""
+ Properties: "TypeAlias" = GetPropertiesResponse
+
API: Final = API(RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, "arm") # pyright: ignore [reportIncompatibleVariableOverride]
@abc.abstractmethod
@@ -315,3 +318,85 @@ async def get_3d_models(
For more information, see `Arm component `_.
"""
...
+
+ @abc.abstractmethod
+ async def set_manual_mode(
+ self,
+ manual_mode: bool,
+ enabled_for: int = 0,
+ *,
+ extra: Optional[Dict[str, Any]] = None,
+ timeout: Optional[float] = None,
+ **kwargs,
+ ):
+ """
+ Enter or exit manual mode for an arm that supports it.
+
+ ::
+
+ my_arm = Arm.from_robot(robot=machine, name="my_arm")
+
+ # Enter manual mode for at most 30 seconds.
+ await my_arm.set_manual_mode(manual_mode=True, enabled_for=30)
+
+ # Exit manual mode.
+ await my_arm.set_manual_mode(manual_mode=False)
+
+ Args:
+ manual_mode (bool): Whether to enter (``True``) or exit (``False``) manual mode.
+ enabled_for (int): How long to stay in manual mode, in seconds. ``0`` means no time limit.
+
+ For more information, see `Arm component `_.
+ """
+ ...
+
+ @abc.abstractmethod
+ async def get_manual_mode(
+ self,
+ *,
+ extra: Optional[Dict[str, Any]] = None,
+ timeout: Optional[float] = None,
+ **kwargs,
+ ) -> bool:
+ """
+ Get whether the arm is currently in manual mode.
+
+ ::
+
+ my_arm = Arm.from_robot(robot=machine, name="my_arm")
+
+ # Print whether the arm is currently in manual mode.
+ print(await my_arm.get_manual_mode())
+
+ Returns:
+ bool: Whether the arm is in manual mode.
+
+ For more information, see `Arm component `_.
+ """
+ ...
+
+ @abc.abstractmethod
+ async def get_properties(
+ self,
+ *,
+ extra: Optional[Dict[str, Any]] = None,
+ timeout: Optional[float] = None,
+ **kwargs,
+ ) -> Properties:
+ """
+ Get a mapping of each optional feature to whether it is supported by this arm.
+
+ ::
+
+ my_arm = Arm.from_robot(robot=machine, name="my_arm")
+
+ # Get the properties of the arm.
+ properties = await my_arm.get_properties()
+
+ Returns:
+ Properties: The arm's properties; whether it supports software-enabled manual mode
+ and whether it supports direct cartesian commands (``move_to_position``).
+
+ For more information, see `Arm component `_.
+ """
+ ...
diff --git a/src/viam/components/arm/client.py b/src/viam/components/arm/client.py
index a602d6bda..343ab8885 100644
--- a/src/viam/components/arm/client.py
+++ b/src/viam/components/arm/client.py
@@ -21,6 +21,9 @@
GetEndPositionResponse,
GetJointPositionsRequest,
GetJointPositionsResponse,
+ GetManualModeRequest,
+ GetManualModeResponse,
+ GetPropertiesRequest,
IsMovingRequest,
IsMovingResponse,
JointPositions,
@@ -28,6 +31,7 @@
MoveThroughJointPositionsRequest,
MoveToJointPositionsRequest,
MoveToPositionRequest,
+ SetManualModeRequest,
StopRequest,
)
from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
@@ -173,3 +177,39 @@ async def get_3d_models(
async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]:
md = kwargs.get("metadata", self.Metadata())
return await get_geometries(self.client, self.name, extra, timeout, md)
+
+ async def set_manual_mode(
+ self,
+ manual_mode: bool,
+ enabled_for: int = 0,
+ *,
+ extra: Optional[Dict[str, Any]] = None,
+ timeout: Optional[float] = None,
+ **kwargs,
+ ):
+ md = kwargs.get("metadata", self.Metadata()).proto
+ request = SetManualModeRequest(name=self.name, manual_mode=manual_mode, enabled_for=enabled_for, extra=dict_to_struct(extra))
+ await self.client.SetManualMode(request, timeout=timeout, metadata=md)
+
+ async def get_manual_mode(
+ self,
+ *,
+ extra: Optional[Dict[str, Any]] = None,
+ timeout: Optional[float] = None,
+ **kwargs,
+ ) -> bool:
+ md = kwargs.get("metadata", self.Metadata()).proto
+ request = GetManualModeRequest(name=self.name, extra=dict_to_struct(extra))
+ response: GetManualModeResponse = await self.client.GetManualMode(request, timeout=timeout, metadata=md)
+ return response.manual_mode
+
+ async def get_properties(
+ self,
+ *,
+ extra: Optional[Dict[str, Any]] = None,
+ timeout: Optional[float] = None,
+ **kwargs,
+ ) -> Arm.Properties:
+ md = kwargs.get("metadata", self.Metadata()).proto
+ request = GetPropertiesRequest(name=self.name, extra=dict_to_struct(extra))
+ return await self.client.GetProperties(request, timeout=timeout, metadata=md)
diff --git a/src/viam/components/arm/service.py b/src/viam/components/arm/service.py
index 8b4884eb6..741711a5b 100644
--- a/src/viam/components/arm/service.py
+++ b/src/viam/components/arm/service.py
@@ -17,6 +17,10 @@
GetEndPositionResponse,
GetJointPositionsRequest,
GetJointPositionsResponse,
+ GetManualModeRequest,
+ GetManualModeResponse,
+ GetPropertiesRequest,
+ GetPropertiesResponse,
IsMovingRequest,
IsMovingResponse,
MoveThroughJointPositionsRequest,
@@ -25,6 +29,8 @@
MoveToJointPositionsResponse,
MoveToPositionRequest,
MoveToPositionResponse,
+ SetManualModeRequest,
+ SetManualModeResponse,
StopRequest,
StopResponse,
UnimplementedArmServiceBase,
@@ -169,3 +175,35 @@ async def GetGeometries(self, stream: Stream[GetGeometriesRequest, GetGeometries
geometries = await arm.get_geometries(extra=struct_to_dict(request.extra), timeout=timeout)
response = GetGeometriesResponse(geometries=geometries)
await stream.send_message(response)
+
+ async def SetManualMode(self, stream: Stream[SetManualModeRequest, SetManualModeResponse]) -> None:
+ request = await stream.recv_message()
+ assert request is not None
+ arm = self.get_resource(request.name)
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
+ await arm.set_manual_mode(
+ request.manual_mode,
+ enabled_for=request.enabled_for,
+ extra=struct_to_dict(request.extra),
+ timeout=timeout,
+ metadata=stream.metadata,
+ )
+ response = SetManualModeResponse()
+ await stream.send_message(response)
+
+ async def GetManualMode(self, stream: Stream[GetManualModeRequest, GetManualModeResponse]) -> None:
+ request = await stream.recv_message()
+ assert request is not None
+ arm = self.get_resource(request.name)
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
+ manual_mode = await arm.get_manual_mode(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
+ response = GetManualModeResponse(manual_mode=manual_mode)
+ await stream.send_message(response)
+
+ async def GetProperties(self, stream: Stream[GetPropertiesRequest, GetPropertiesResponse]) -> None:
+ request = await stream.recv_message()
+ assert request is not None
+ arm = self.get_resource(request.name)
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
+ response = await arm.get_properties(extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata)
+ await stream.send_message(response)
diff --git a/src/viam/gen/component/arm/v1/arm_grpc.py b/src/viam/gen/component/arm/v1/arm_grpc.py
index 7eb7c2db4..7f37372e9 100644
--- a/src/viam/gen/component/arm/v1/arm_grpc.py
+++ b/src/viam/gen/component/arm/v1/arm_grpc.py
@@ -65,8 +65,20 @@ async def GetGeometries(self, stream: 'grpclib.server.Stream[common.v1.common_pb
async def Get3DModels(self, stream: 'grpclib.server.Stream[common.v1.common_pb2.Get3DModelsRequest, common.v1.common_pb2.Get3DModelsResponse]') -> None:
pass
+ @abc.abstractmethod
+ async def SetManualMode(self, stream: 'grpclib.server.Stream[component.arm.v1.arm_pb2.SetManualModeRequest, component.arm.v1.arm_pb2.SetManualModeResponse]') -> None:
+ pass
+
+ @abc.abstractmethod
+ async def GetManualMode(self, stream: 'grpclib.server.Stream[component.arm.v1.arm_pb2.GetManualModeRequest, component.arm.v1.arm_pb2.GetManualModeResponse]') -> None:
+ pass
+
+ @abc.abstractmethod
+ async def GetProperties(self, stream: 'grpclib.server.Stream[component.arm.v1.arm_pb2.GetPropertiesRequest, component.arm.v1.arm_pb2.GetPropertiesResponse]') -> None:
+ pass
+
def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]:
- return {'/viam.component.arm.v1.ArmService/GetEndPosition': grpclib.const.Handler(self.GetEndPosition, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.GetEndPositionRequest, component.arm.v1.arm_pb2.GetEndPositionResponse), '/viam.component.arm.v1.ArmService/MoveToPosition': grpclib.const.Handler(self.MoveToPosition, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.MoveToPositionRequest, component.arm.v1.arm_pb2.MoveToPositionResponse), '/viam.component.arm.v1.ArmService/GetJointPositions': grpclib.const.Handler(self.GetJointPositions, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.GetJointPositionsRequest, component.arm.v1.arm_pb2.GetJointPositionsResponse), '/viam.component.arm.v1.ArmService/MoveToJointPositions': grpclib.const.Handler(self.MoveToJointPositions, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.MoveToJointPositionsRequest, component.arm.v1.arm_pb2.MoveToJointPositionsResponse), '/viam.component.arm.v1.ArmService/MoveThroughJointPositions': grpclib.const.Handler(self.MoveThroughJointPositions, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.MoveThroughJointPositionsRequest, component.arm.v1.arm_pb2.MoveThroughJointPositionsResponse), '/viam.component.arm.v1.ArmService/MoveThroughJointPositionsStreamed': grpclib.const.Handler(self.MoveThroughJointPositionsStreamed, grpclib.const.Cardinality.STREAM_STREAM, component.arm.v1.arm_pb2.MoveThroughJointPositionsStreamedRequest, component.arm.v1.arm_pb2.MoveThroughJointPositionsStreamedResponse), '/viam.component.arm.v1.ArmService/Stop': grpclib.const.Handler(self.Stop, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.StopRequest, component.arm.v1.arm_pb2.StopResponse), '/viam.component.arm.v1.ArmService/IsMoving': grpclib.const.Handler(self.IsMoving, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.IsMovingRequest, component.arm.v1.arm_pb2.IsMovingResponse), '/viam.component.arm.v1.ArmService/DoCommand': grpclib.const.Handler(self.DoCommand, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.DoCommandRequest, common.v1.common_pb2.DoCommandResponse), '/viam.component.arm.v1.ArmService/GetStatus': grpclib.const.Handler(self.GetStatus, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetStatusRequest, common.v1.common_pb2.GetStatusResponse), '/viam.component.arm.v1.ArmService/GetKinematics': grpclib.const.Handler(self.GetKinematics, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetKinematicsRequest, common.v1.common_pb2.GetKinematicsResponse), '/viam.component.arm.v1.ArmService/GetGeometries': grpclib.const.Handler(self.GetGeometries, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetGeometriesRequest, common.v1.common_pb2.GetGeometriesResponse), '/viam.component.arm.v1.ArmService/Get3DModels': grpclib.const.Handler(self.Get3DModels, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.Get3DModelsRequest, common.v1.common_pb2.Get3DModelsResponse)}
+ return {'/viam.component.arm.v1.ArmService/GetEndPosition': grpclib.const.Handler(self.GetEndPosition, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.GetEndPositionRequest, component.arm.v1.arm_pb2.GetEndPositionResponse), '/viam.component.arm.v1.ArmService/MoveToPosition': grpclib.const.Handler(self.MoveToPosition, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.MoveToPositionRequest, component.arm.v1.arm_pb2.MoveToPositionResponse), '/viam.component.arm.v1.ArmService/GetJointPositions': grpclib.const.Handler(self.GetJointPositions, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.GetJointPositionsRequest, component.arm.v1.arm_pb2.GetJointPositionsResponse), '/viam.component.arm.v1.ArmService/MoveToJointPositions': grpclib.const.Handler(self.MoveToJointPositions, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.MoveToJointPositionsRequest, component.arm.v1.arm_pb2.MoveToJointPositionsResponse), '/viam.component.arm.v1.ArmService/MoveThroughJointPositions': grpclib.const.Handler(self.MoveThroughJointPositions, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.MoveThroughJointPositionsRequest, component.arm.v1.arm_pb2.MoveThroughJointPositionsResponse), '/viam.component.arm.v1.ArmService/MoveThroughJointPositionsStreamed': grpclib.const.Handler(self.MoveThroughJointPositionsStreamed, grpclib.const.Cardinality.STREAM_STREAM, component.arm.v1.arm_pb2.MoveThroughJointPositionsStreamedRequest, component.arm.v1.arm_pb2.MoveThroughJointPositionsStreamedResponse), '/viam.component.arm.v1.ArmService/Stop': grpclib.const.Handler(self.Stop, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.StopRequest, component.arm.v1.arm_pb2.StopResponse), '/viam.component.arm.v1.ArmService/IsMoving': grpclib.const.Handler(self.IsMoving, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.IsMovingRequest, component.arm.v1.arm_pb2.IsMovingResponse), '/viam.component.arm.v1.ArmService/DoCommand': grpclib.const.Handler(self.DoCommand, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.DoCommandRequest, common.v1.common_pb2.DoCommandResponse), '/viam.component.arm.v1.ArmService/GetStatus': grpclib.const.Handler(self.GetStatus, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetStatusRequest, common.v1.common_pb2.GetStatusResponse), '/viam.component.arm.v1.ArmService/GetKinematics': grpclib.const.Handler(self.GetKinematics, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetKinematicsRequest, common.v1.common_pb2.GetKinematicsResponse), '/viam.component.arm.v1.ArmService/GetGeometries': grpclib.const.Handler(self.GetGeometries, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.GetGeometriesRequest, common.v1.common_pb2.GetGeometriesResponse), '/viam.component.arm.v1.ArmService/Get3DModels': grpclib.const.Handler(self.Get3DModels, grpclib.const.Cardinality.UNARY_UNARY, common.v1.common_pb2.Get3DModelsRequest, common.v1.common_pb2.Get3DModelsResponse), '/viam.component.arm.v1.ArmService/SetManualMode': grpclib.const.Handler(self.SetManualMode, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.SetManualModeRequest, component.arm.v1.arm_pb2.SetManualModeResponse), '/viam.component.arm.v1.ArmService/GetManualMode': grpclib.const.Handler(self.GetManualMode, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.GetManualModeRequest, component.arm.v1.arm_pb2.GetManualModeResponse), '/viam.component.arm.v1.ArmService/GetProperties': grpclib.const.Handler(self.GetProperties, grpclib.const.Cardinality.UNARY_UNARY, component.arm.v1.arm_pb2.GetPropertiesRequest, component.arm.v1.arm_pb2.GetPropertiesResponse)}
class UnimplementedArmServiceBase(ArmServiceBase):
@@ -109,6 +121,15 @@ async def GetGeometries(self, stream: 'grpclib.server.Stream[common.v1.common_pb
async def Get3DModels(self, stream: 'grpclib.server.Stream[common.v1.common_pb2.Get3DModelsRequest, common.v1.common_pb2.Get3DModelsResponse]') -> None:
raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
+ async def SetManualMode(self, stream: 'grpclib.server.Stream[component.arm.v1.arm_pb2.SetManualModeRequest, component.arm.v1.arm_pb2.SetManualModeResponse]') -> None:
+ raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
+
+ async def GetManualMode(self, stream: 'grpclib.server.Stream[component.arm.v1.arm_pb2.GetManualModeRequest, component.arm.v1.arm_pb2.GetManualModeResponse]') -> None:
+ raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
+
+ async def GetProperties(self, stream: 'grpclib.server.Stream[component.arm.v1.arm_pb2.GetPropertiesRequest, component.arm.v1.arm_pb2.GetPropertiesResponse]') -> None:
+ raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
+
class ArmServiceStub:
def __init__(self, channel: grpclib.client.Channel) -> None:
@@ -124,4 +145,7 @@ def __init__(self, channel: grpclib.client.Channel) -> None:
self.GetStatus = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.arm.v1.ArmService/GetStatus', common.v1.common_pb2.GetStatusRequest, common.v1.common_pb2.GetStatusResponse)
self.GetKinematics = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.arm.v1.ArmService/GetKinematics', common.v1.common_pb2.GetKinematicsRequest, common.v1.common_pb2.GetKinematicsResponse)
self.GetGeometries = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.arm.v1.ArmService/GetGeometries', common.v1.common_pb2.GetGeometriesRequest, common.v1.common_pb2.GetGeometriesResponse)
- self.Get3DModels = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.arm.v1.ArmService/Get3DModels', common.v1.common_pb2.Get3DModelsRequest, common.v1.common_pb2.Get3DModelsResponse)
\ No newline at end of file
+ self.Get3DModels = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.arm.v1.ArmService/Get3DModels', common.v1.common_pb2.Get3DModelsRequest, common.v1.common_pb2.Get3DModelsResponse)
+ self.SetManualMode = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.arm.v1.ArmService/SetManualMode', component.arm.v1.arm_pb2.SetManualModeRequest, component.arm.v1.arm_pb2.SetManualModeResponse)
+ self.GetManualMode = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.arm.v1.ArmService/GetManualMode', component.arm.v1.arm_pb2.GetManualModeRequest, component.arm.v1.arm_pb2.GetManualModeResponse)
+ self.GetProperties = grpclib.client.UnaryUnaryMethod(channel, '/viam.component.arm.v1.ArmService/GetProperties', component.arm.v1.arm_pb2.GetPropertiesRequest, component.arm.v1.arm_pb2.GetPropertiesResponse)
\ No newline at end of file
diff --git a/src/viam/gen/component/arm/v1/arm_pb2.py b/src/viam/gen/component/arm/v1/arm_pb2.py
index e419b1d79..5f04959ac 100644
--- a/src/viam/gen/component/arm/v1/arm_pb2.py
+++ b/src/viam/gen/component/arm/v1/arm_pb2.py
@@ -10,7 +10,7 @@
from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1acomponent/arm/v1/arm.proto\x12\x15viam.component.arm.v1\x1a\x16common/v1/common.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto"Z\n\x15GetEndPositionRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"B\n\x16GetEndPositionResponse\x12(\n\x04pose\x18\x01 \x01(\x0b2\x14.viam.common.v1.PoseR\x04pose"(\n\x0eJointPositions\x12\x16\n\x06values\x18\x01 \x03(\x01R\x06values")\n\x0fJointVelocities\x12\x16\n\x06values\x18\x01 \x03(\x01R\x06values",\n\x12JointAccelerations\x12\x16\n\x06values\x18\x01 \x03(\x01R\x06values"]\n\x18GetJointPositionsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"`\n\x19GetJointPositionsResponse\x12C\n\tpositions\x18\x01 \x01(\x0b2%.viam.component.arm.v1.JointPositionsR\tpositions"\x80\x01\n\x15MoveToPositionRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12$\n\x02to\x18\x02 \x01(\x0b2\x14.viam.common.v1.PoseR\x02to\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x18\n\x16MoveToPositionResponse"\xa5\x01\n\x1bMoveToJointPositionsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12C\n\tpositions\x18\x02 \x01(\x0b2%.viam.component.arm.v1.JointPositionsR\tpositions\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x1e\n\x1cMoveToJointPositionsResponse"\xf9\x01\n MoveThroughJointPositionsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12C\n\tpositions\x18\x02 \x03(\x0b2%.viam.component.arm.v1.JointPositionsR\tpositions\x12A\n\x07options\x18\x03 \x01(\x0b2".viam.component.arm.v1.MoveOptionsH\x00R\x07options\x88\x01\x01\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extraB\n\n\x08_options"#\n!MoveThroughJointPositionsResponse"\xc2\x03\n\x0fTrajectoryPoint\x12-\n\x04time\x18\x01 \x01(\x0b2\x19.google.protobuf.DurationR\x04time\x12C\n\tpositions\x18\x02 \x01(\x0b2%.viam.component.arm.v1.JointPositionsR\tpositions\x12b\n\x0bconstraints\x18\x03 \x01(\x0b2;.viam.component.arm.v1.TrajectoryPoint.KinematicConstraintsH\x00R\x0bconstraints\x88\x01\x01\x1a\xc6\x01\n\x14KinematicConstraints\x12F\n\nvelocities\x18\x01 \x01(\x0b2&.viam.component.arm.v1.JointVelocitiesR\nvelocities\x12T\n\raccelerations\x18\x02 \x01(\x0b2).viam.component.arm.v1.JointAccelerationsH\x00R\raccelerations\x88\x01\x01B\x10\n\x0e_accelerationsB\x0e\n\x0c_constraints"\x98\x03\n(MoveThroughJointPositionsStreamedRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12Z\n\x04init\x18\x02 \x01(\x0b2D.viam.component.arm.v1.MoveThroughJointPositionsStreamedRequest.InitH\x00R\x04init\x12g\n\x05batch\x18\x03 \x01(\x0b2O.viam.component.arm.v1.MoveThroughJointPositionsStreamedRequest.TrajectoryBatchH\x00R\x05batch\x1a5\n\x04Init\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra\x1aQ\n\x0fTrajectoryBatch\x12>\n\x06points\x18\x01 \x03(\x0b2&.viam.component.arm.v1.TrajectoryPointR\x06pointsB\t\n\x07message"\xd0\x01\n)MoveThroughJointPositionsStreamedResponse\x12]\n\x03ack\x18\x01 \x01(\x0b2I.viam.component.arm.v1.MoveThroughJointPositionsStreamedResponse.BatchAckH\x00R\x03ack\x1a9\n\x08BatchAck\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extraB\t\n\x07message"P\n\x0bStopRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x0e\n\x0cStopResponse"\xae\x01\n\x06Status\x127\n\x0cend_position\x18\x01 \x01(\x0b2\x14.viam.common.v1.PoseR\x0bendPosition\x12N\n\x0fjoint_positions\x18\x02 \x01(\x0b2%.viam.component.arm.v1.JointPositionsR\x0ejointPositions\x12\x1b\n\tis_moving\x18\x03 \x01(\x08R\x08isMoving"%\n\x0fIsMovingRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"/\n\x10IsMovingResponse\x12\x1b\n\tis_moving\x18\x01 \x01(\x08R\x08isMoving"\xe3\x02\n\x0bMoveOptions\x123\n\x14max_vel_degs_per_sec\x18\x01 \x01(\x01H\x00R\x10maxVelDegsPerSec\x88\x01\x01\x125\n\x15max_acc_degs_per_sec2\x18\x02 \x01(\x01H\x01R\x11maxAccDegsPerSec2\x88\x01\x01\x12;\n\x1bmax_vel_degs_per_sec_joints\x18\x03 \x03(\x01R\x16maxVelDegsPerSecJoints\x12=\n\x1cmax_acc_degs_per_sec2_joints\x18\x04 \x03(\x01R\x17maxAccDegsPerSec2Joints\x12\'\n\rmax_tcp_speed\x18\x05 \x01(\x01H\x02R\x0bmaxTcpSpeed\x88\x01\x01B\x17\n\x15_max_vel_degs_per_secB\x18\n\x16_max_acc_degs_per_sec2B\x10\n\x0e_max_tcp_speed2\xbb\x10\n\nArmService\x12\xa1\x01\n\x0eGetEndPosition\x12,.viam.component.arm.v1.GetEndPositionRequest\x1a-.viam.component.arm.v1.GetEndPositionResponse"2\x82\xd3\xe4\x93\x02,\x12*/viam/api/v1/component/arm/{name}/position\x12\xa5\x01\n\x0eMoveToPosition\x12,.viam.component.arm.v1.MoveToPositionRequest\x1a-.viam.component.arm.v1.MoveToPositionResponse"6\xa0\x92)\x01\x82\xd3\xe4\x93\x02,\x1a*/viam/api/v1/component/arm/{name}/position\x12\xb1\x01\n\x11GetJointPositions\x12/.viam.component.arm.v1.GetJointPositionsRequest\x1a0.viam.component.arm.v1.GetJointPositionsResponse"9\x82\xd3\xe4\x93\x023\x121/viam/api/v1/component/arm/{name}/joint_positions\x12\xbe\x01\n\x14MoveToJointPositions\x122.viam.component.arm.v1.MoveToJointPositionsRequest\x1a3.viam.component.arm.v1.MoveToJointPositionsResponse"=\xa0\x92)\x01\x82\xd3\xe4\x93\x023\x1a1/viam/api/v1/component/arm/{name}/joint_positions\x12\xda\x01\n\x19MoveThroughJointPositions\x127.viam.component.arm.v1.MoveThroughJointPositionsRequest\x1a8.viam.component.arm.v1.MoveThroughJointPositionsResponse"J\xa0\x92)\x01\x82\xd3\xe4\x93\x02@">/viam/api/v1/component/arm/{name}/move_through_joint_positions\x12\xb0\x01\n!MoveThroughJointPositionsStreamed\x12?.viam.component.arm.v1.MoveThroughJointPositionsStreamedRequest\x1a@.viam.component.arm.v1.MoveThroughJointPositionsStreamedResponse"\x04\xa0\x92)\x01(\x010\x01\x12\x7f\n\x04Stop\x12".viam.component.arm.v1.StopRequest\x1a#.viam.component.arm.v1.StopResponse".\x82\xd3\xe4\x93\x02("&/viam/api/v1/component/arm/{name}/stop\x12\x90\x01\n\x08IsMoving\x12&.viam.component.arm.v1.IsMovingRequest\x1a\'.viam.component.arm.v1.IsMovingResponse"3\x82\xd3\xe4\x93\x02-\x12+/viam/api/v1/component/arm/{name}/is_moving\x12\x86\x01\n\tDoCommand\x12 .viam.common.v1.DoCommandRequest\x1a!.viam.common.v1.DoCommandResponse"4\x82\xd3\xe4\x93\x02.",/viam/api/v1/component/arm/{name}/do_command\x12\x86\x01\n\tGetStatus\x12 .viam.common.v1.GetStatusRequest\x1a!.viam.common.v1.GetStatusResponse"4\x82\xd3\xe4\x93\x02.\x12,/viam/api/v1/component/arm/{name}/get_status\x12\x92\x01\n\rGetKinematics\x12$.viam.common.v1.GetKinematicsRequest\x1a%.viam.common.v1.GetKinematicsResponse"4\x82\xd3\xe4\x93\x02.\x12,/viam/api/v1/component/arm/{name}/kinematics\x12\x92\x01\n\rGetGeometries\x12$.viam.common.v1.GetGeometriesRequest\x1a%.viam.common.v1.GetGeometriesResponse"4\x82\xd3\xe4\x93\x02.\x12,/viam/api/v1/component/arm/{name}/geometries\x12\x8b\x01\n\x0bGet3DModels\x12".viam.common.v1.Get3DModelsRequest\x1a#.viam.common.v1.Get3DModelsResponse"3\x82\xd3\xe4\x93\x02-\x12+/viam/api/v1/component/arm/{name}/3d_modelsB=\n\x19com.viam.component.arm.v1Z go.viam.com/api/component/arm/v1b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1acomponent/arm/v1/arm.proto\x12\x15viam.component.arm.v1\x1a\x16common/v1/common.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto"Z\n\x15GetEndPositionRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"B\n\x16GetEndPositionResponse\x12(\n\x04pose\x18\x01 \x01(\x0b2\x14.viam.common.v1.PoseR\x04pose"(\n\x0eJointPositions\x12\x16\n\x06values\x18\x01 \x03(\x01R\x06values")\n\x0fJointVelocities\x12\x16\n\x06values\x18\x01 \x03(\x01R\x06values",\n\x12JointAccelerations\x12\x16\n\x06values\x18\x01 \x03(\x01R\x06values"]\n\x18GetJointPositionsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"`\n\x19GetJointPositionsResponse\x12C\n\tpositions\x18\x01 \x01(\x0b2%.viam.component.arm.v1.JointPositionsR\tpositions"\x80\x01\n\x15MoveToPositionRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12$\n\x02to\x18\x02 \x01(\x0b2\x14.viam.common.v1.PoseR\x02to\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x18\n\x16MoveToPositionResponse"\xa5\x01\n\x1bMoveToJointPositionsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12C\n\tpositions\x18\x02 \x01(\x0b2%.viam.component.arm.v1.JointPositionsR\tpositions\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x1e\n\x1cMoveToJointPositionsResponse"\xf9\x01\n MoveThroughJointPositionsRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12C\n\tpositions\x18\x02 \x03(\x0b2%.viam.component.arm.v1.JointPositionsR\tpositions\x12A\n\x07options\x18\x03 \x01(\x0b2".viam.component.arm.v1.MoveOptionsH\x00R\x07options\x88\x01\x01\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extraB\n\n\x08_options"#\n!MoveThroughJointPositionsResponse"\xc2\x03\n\x0fTrajectoryPoint\x12-\n\x04time\x18\x01 \x01(\x0b2\x19.google.protobuf.DurationR\x04time\x12C\n\tpositions\x18\x02 \x01(\x0b2%.viam.component.arm.v1.JointPositionsR\tpositions\x12b\n\x0bconstraints\x18\x03 \x01(\x0b2;.viam.component.arm.v1.TrajectoryPoint.KinematicConstraintsH\x00R\x0bconstraints\x88\x01\x01\x1a\xc6\x01\n\x14KinematicConstraints\x12F\n\nvelocities\x18\x01 \x01(\x0b2&.viam.component.arm.v1.JointVelocitiesR\nvelocities\x12T\n\raccelerations\x18\x02 \x01(\x0b2).viam.component.arm.v1.JointAccelerationsH\x00R\raccelerations\x88\x01\x01B\x10\n\x0e_accelerationsB\x0e\n\x0c_constraints"\x98\x03\n(MoveThroughJointPositionsStreamedRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12Z\n\x04init\x18\x02 \x01(\x0b2D.viam.component.arm.v1.MoveThroughJointPositionsStreamedRequest.InitH\x00R\x04init\x12g\n\x05batch\x18\x03 \x01(\x0b2O.viam.component.arm.v1.MoveThroughJointPositionsStreamedRequest.TrajectoryBatchH\x00R\x05batch\x1a5\n\x04Init\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra\x1aQ\n\x0fTrajectoryBatch\x12>\n\x06points\x18\x01 \x03(\x0b2&.viam.component.arm.v1.TrajectoryPointR\x06pointsB\t\n\x07message"\xd0\x01\n)MoveThroughJointPositionsStreamedResponse\x12]\n\x03ack\x18\x01 \x01(\x0b2I.viam.component.arm.v1.MoveThroughJointPositionsStreamedResponse.BatchAckH\x00R\x03ack\x1a9\n\x08BatchAck\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extraB\t\n\x07message"P\n\x0bStopRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x0e\n\x0cStopResponse"\xae\x01\n\x06Status\x127\n\x0cend_position\x18\x01 \x01(\x0b2\x14.viam.common.v1.PoseR\x0bendPosition\x12N\n\x0fjoint_positions\x18\x02 \x01(\x0b2%.viam.component.arm.v1.JointPositionsR\x0ejointPositions\x12\x1b\n\tis_moving\x18\x03 \x01(\x08R\x08isMoving"%\n\x0fIsMovingRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"/\n\x10IsMovingResponse\x12\x1b\n\tis_moving\x18\x01 \x01(\x08R\x08isMoving"\xe3\x02\n\x0bMoveOptions\x123\n\x14max_vel_degs_per_sec\x18\x01 \x01(\x01H\x00R\x10maxVelDegsPerSec\x88\x01\x01\x125\n\x15max_acc_degs_per_sec2\x18\x02 \x01(\x01H\x01R\x11maxAccDegsPerSec2\x88\x01\x01\x12;\n\x1bmax_vel_degs_per_sec_joints\x18\x03 \x03(\x01R\x16maxVelDegsPerSecJoints\x12=\n\x1cmax_acc_degs_per_sec2_joints\x18\x04 \x03(\x01R\x17maxAccDegsPerSec2Joints\x12\'\n\rmax_tcp_speed\x18\x05 \x01(\x01H\x02R\x0bmaxTcpSpeed\x88\x01\x01B\x17\n\x15_max_vel_degs_per_secB\x18\n\x16_max_acc_degs_per_sec2B\x10\n\x0e_max_tcp_speed"\x9b\x01\n\x14SetManualModeRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1f\n\x0bmanual_mode\x18\x02 \x01(\x08R\nmanualMode\x12\x1f\n\x0benabled_for\x18\x03 \x01(\x05R\nenabledFor\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x17\n\x15SetManualModeResponse"Y\n\x14GetManualModeRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"8\n\x15GetManualModeResponse\x12\x1f\n\x0bmanual_mode\x18\x01 \x01(\x08R\nmanualMode"Y\n\x14GetPropertiesRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12-\n\x05extra\x18c \x01(\x0b2\x17.google.protobuf.StructR\x05extra"\x85\x01\n\x15GetPropertiesResponse\x12.\n\x13support_manual_mode\x18\x01 \x01(\x08R\x11supportManualMode\x12<\n\x1asupport_cartesian_commands\x18\x02 \x01(\x08R\x18supportCartesianCommands2\xa4\x14\n\nArmService\x12\xa1\x01\n\x0eGetEndPosition\x12,.viam.component.arm.v1.GetEndPositionRequest\x1a-.viam.component.arm.v1.GetEndPositionResponse"2\x82\xd3\xe4\x93\x02,\x12*/viam/api/v1/component/arm/{name}/position\x12\xa5\x01\n\x0eMoveToPosition\x12,.viam.component.arm.v1.MoveToPositionRequest\x1a-.viam.component.arm.v1.MoveToPositionResponse"6\xa0\x92)\x01\x82\xd3\xe4\x93\x02,\x1a*/viam/api/v1/component/arm/{name}/position\x12\xb1\x01\n\x11GetJointPositions\x12/.viam.component.arm.v1.GetJointPositionsRequest\x1a0.viam.component.arm.v1.GetJointPositionsResponse"9\x82\xd3\xe4\x93\x023\x121/viam/api/v1/component/arm/{name}/joint_positions\x12\xbe\x01\n\x14MoveToJointPositions\x122.viam.component.arm.v1.MoveToJointPositionsRequest\x1a3.viam.component.arm.v1.MoveToJointPositionsResponse"=\xa0\x92)\x01\x82\xd3\xe4\x93\x023\x1a1/viam/api/v1/component/arm/{name}/joint_positions\x12\xda\x01\n\x19MoveThroughJointPositions\x127.viam.component.arm.v1.MoveThroughJointPositionsRequest\x1a8.viam.component.arm.v1.MoveThroughJointPositionsResponse"J\xa0\x92)\x01\x82\xd3\xe4\x93\x02@">/viam/api/v1/component/arm/{name}/move_through_joint_positions\x12\xb0\x01\n!MoveThroughJointPositionsStreamed\x12?.viam.component.arm.v1.MoveThroughJointPositionsStreamedRequest\x1a@.viam.component.arm.v1.MoveThroughJointPositionsStreamedResponse"\x04\xa0\x92)\x01(\x010\x01\x12\x7f\n\x04Stop\x12".viam.component.arm.v1.StopRequest\x1a#.viam.component.arm.v1.StopResponse".\x82\xd3\xe4\x93\x02("&/viam/api/v1/component/arm/{name}/stop\x12\x90\x01\n\x08IsMoving\x12&.viam.component.arm.v1.IsMovingRequest\x1a\'.viam.component.arm.v1.IsMovingResponse"3\x82\xd3\xe4\x93\x02-\x12+/viam/api/v1/component/arm/{name}/is_moving\x12\x86\x01\n\tDoCommand\x12 .viam.common.v1.DoCommandRequest\x1a!.viam.common.v1.DoCommandResponse"4\x82\xd3\xe4\x93\x02.",/viam/api/v1/component/arm/{name}/do_command\x12\x86\x01\n\tGetStatus\x12 .viam.common.v1.GetStatusRequest\x1a!.viam.common.v1.GetStatusResponse"4\x82\xd3\xe4\x93\x02.\x12,/viam/api/v1/component/arm/{name}/get_status\x12\x92\x01\n\rGetKinematics\x12$.viam.common.v1.GetKinematicsRequest\x1a%.viam.common.v1.GetKinematicsResponse"4\x82\xd3\xe4\x93\x02.\x12,/viam/api/v1/component/arm/{name}/kinematics\x12\x92\x01\n\rGetGeometries\x12$.viam.common.v1.GetGeometriesRequest\x1a%.viam.common.v1.GetGeometriesResponse"4\x82\xd3\xe4\x93\x02.\x12,/viam/api/v1/component/arm/{name}/geometries\x12\x8b\x01\n\x0bGet3DModels\x12".viam.common.v1.Get3DModelsRequest\x1a#.viam.common.v1.Get3DModelsResponse"3\x82\xd3\xe4\x93\x02-\x12+/viam/api/v1/component/arm/{name}/3d_models\x12\xa1\x01\n\rSetManualMode\x12+.viam.component.arm.v1.SetManualModeRequest\x1a,.viam.component.arm.v1.SetManualModeResponse"5\x82\xd3\xe4\x93\x02/\x1a-/viam/api/v1/component/arm/{name}/manual_mode\x12\xa1\x01\n\rGetManualMode\x12+.viam.component.arm.v1.GetManualModeRequest\x1a,.viam.component.arm.v1.GetManualModeResponse"5\x82\xd3\xe4\x93\x02/\x12-/viam/api/v1/component/arm/{name}/manual_mode\x12\x9e\x01\n\rGetProperties\x12+.viam.component.arm.v1.GetPropertiesRequest\x1a,.viam.component.arm.v1.GetPropertiesResponse"2\x82\xd3\xe4\x93\x02,\x12*/viam/api/v1/component/arm/{name}/featuresB=\n\x19com.viam.component.arm.v1Z go.viam.com/api/component/arm/v1b\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'component.arm.v1.arm_pb2', _globals)
@@ -43,6 +43,12 @@
_globals['_ARMSERVICE'].methods_by_name['GetGeometries']._serialized_options = b'\x82\xd3\xe4\x93\x02.\x12,/viam/api/v1/component/arm/{name}/geometries'
_globals['_ARMSERVICE'].methods_by_name['Get3DModels']._loaded_options = None
_globals['_ARMSERVICE'].methods_by_name['Get3DModels']._serialized_options = b'\x82\xd3\xe4\x93\x02-\x12+/viam/api/v1/component/arm/{name}/3d_models'
+ _globals['_ARMSERVICE'].methods_by_name['SetManualMode']._loaded_options = None
+ _globals['_ARMSERVICE'].methods_by_name['SetManualMode']._serialized_options = b'\x82\xd3\xe4\x93\x02/\x1a-/viam/api/v1/component/arm/{name}/manual_mode'
+ _globals['_ARMSERVICE'].methods_by_name['GetManualMode']._loaded_options = None
+ _globals['_ARMSERVICE'].methods_by_name['GetManualMode']._serialized_options = b'\x82\xd3\xe4\x93\x02/\x12-/viam/api/v1/component/arm/{name}/manual_mode'
+ _globals['_ARMSERVICE'].methods_by_name['GetProperties']._loaded_options = None
+ _globals['_ARMSERVICE'].methods_by_name['GetProperties']._serialized_options = b'\x82\xd3\xe4\x93\x02,\x12*/viam/api/v1/component/arm/{name}/features'
_globals['_GETENDPOSITIONREQUEST']._serialized_start = 169
_globals['_GETENDPOSITIONREQUEST']._serialized_end = 259
_globals['_GETENDPOSITIONRESPONSE']._serialized_start = 261
@@ -95,5 +101,17 @@
_globals['_ISMOVINGRESPONSE']._serialized_end = 2735
_globals['_MOVEOPTIONS']._serialized_start = 2738
_globals['_MOVEOPTIONS']._serialized_end = 3093
- _globals['_ARMSERVICE']._serialized_start = 3096
- _globals['_ARMSERVICE']._serialized_end = 5203
\ No newline at end of file
+ _globals['_SETMANUALMODEREQUEST']._serialized_start = 3096
+ _globals['_SETMANUALMODEREQUEST']._serialized_end = 3251
+ _globals['_SETMANUALMODERESPONSE']._serialized_start = 3253
+ _globals['_SETMANUALMODERESPONSE']._serialized_end = 3276
+ _globals['_GETMANUALMODEREQUEST']._serialized_start = 3278
+ _globals['_GETMANUALMODEREQUEST']._serialized_end = 3367
+ _globals['_GETMANUALMODERESPONSE']._serialized_start = 3369
+ _globals['_GETMANUALMODERESPONSE']._serialized_end = 3425
+ _globals['_GETPROPERTIESREQUEST']._serialized_start = 3427
+ _globals['_GETPROPERTIESREQUEST']._serialized_end = 3516
+ _globals['_GETPROPERTIESRESPONSE']._serialized_start = 3519
+ _globals['_GETPROPERTIESRESPONSE']._serialized_end = 3652
+ _globals['_ARMSERVICE']._serialized_start = 3655
+ _globals['_ARMSERVICE']._serialized_end = 6251
\ No newline at end of file
diff --git a/src/viam/gen/component/arm/v1/arm_pb2.pyi b/src/viam/gen/component/arm/v1/arm_pb2.pyi
index d39d9e8f7..3530eb53b 100644
--- a/src/viam/gen/component/arm/v1/arm_pb2.pyi
+++ b/src/viam/gen/component/arm/v1/arm_pb2.pyi
@@ -644,4 +644,123 @@ class MoveOptions(_message.Message):
@_typing.overload
def WhichOneof(self, oneof_group: _WhichOneofArgType__max_vel_degs_per_sec) -> _WhichOneofReturnType__max_vel_degs_per_sec | None:
...
-Global___MoveOptions: _TypeAlias = MoveOptions
\ No newline at end of file
+Global___MoveOptions: _TypeAlias = MoveOptions
+
+@_typing.final
+class SetManualModeRequest(_message.Message):
+ DESCRIPTOR: _descriptor.Descriptor
+ NAME_FIELD_NUMBER: _builtins.int
+ MANUAL_MODE_FIELD_NUMBER: _builtins.int
+ ENABLED_FOR_FIELD_NUMBER: _builtins.int
+ EXTRA_FIELD_NUMBER: _builtins.int
+ name: _builtins.str
+ 'Name of an arm'
+ manual_mode: _builtins.bool
+ 'True to enter manual mode, false to exit it'
+ enabled_for: _builtins.int
+ 'How long to stay in manual mode, in seconds; 0 means no time limit'
+
+ @_builtins.property
+ def extra(self) -> _struct_pb2.Struct:
+ """Additional arguments to the method"""
+
+ def __init__(self, *, name: _builtins.str=..., manual_mode: _builtins.bool=..., enabled_for: _builtins.int=..., extra: _struct_pb2.Struct | None=...) -> None:
+ ...
+ _HasFieldArgType: _TypeAlias = _typing.Literal['extra', b'extra']
+
+ def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool:
+ ...
+ _ClearFieldArgType: _TypeAlias = _typing.Literal['enabled_for', b'enabled_for', 'extra', b'extra', 'manual_mode', b'manual_mode', 'name', b'name']
+
+ def ClearField(self, field_name: _ClearFieldArgType) -> None:
+ ...
+Global___SetManualModeRequest: _TypeAlias = SetManualModeRequest
+
+@_typing.final
+class SetManualModeResponse(_message.Message):
+ DESCRIPTOR: _descriptor.Descriptor
+
+ def __init__(self) -> None:
+ ...
+Global___SetManualModeResponse: _TypeAlias = SetManualModeResponse
+
+@_typing.final
+class GetManualModeRequest(_message.Message):
+ DESCRIPTOR: _descriptor.Descriptor
+ NAME_FIELD_NUMBER: _builtins.int
+ EXTRA_FIELD_NUMBER: _builtins.int
+ name: _builtins.str
+ 'Name of an arm'
+
+ @_builtins.property
+ def extra(self) -> _struct_pb2.Struct:
+ """Additional arguments to the method"""
+
+ def __init__(self, *, name: _builtins.str=..., extra: _struct_pb2.Struct | None=...) -> None:
+ ...
+ _HasFieldArgType: _TypeAlias = _typing.Literal['extra', b'extra']
+
+ def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool:
+ ...
+ _ClearFieldArgType: _TypeAlias = _typing.Literal['extra', b'extra', 'name', b'name']
+
+ def ClearField(self, field_name: _ClearFieldArgType) -> None:
+ ...
+Global___GetManualModeRequest: _TypeAlias = GetManualModeRequest
+
+@_typing.final
+class GetManualModeResponse(_message.Message):
+ DESCRIPTOR: _descriptor.Descriptor
+ MANUAL_MODE_FIELD_NUMBER: _builtins.int
+ manual_mode: _builtins.bool
+ 'True if the arm is in manual mode'
+
+ def __init__(self, *, manual_mode: _builtins.bool=...) -> None:
+ ...
+ _ClearFieldArgType: _TypeAlias = _typing.Literal['manual_mode', b'manual_mode']
+
+ def ClearField(self, field_name: _ClearFieldArgType) -> None:
+ ...
+Global___GetManualModeResponse: _TypeAlias = GetManualModeResponse
+
+@_typing.final
+class GetPropertiesRequest(_message.Message):
+ DESCRIPTOR: _descriptor.Descriptor
+ NAME_FIELD_NUMBER: _builtins.int
+ EXTRA_FIELD_NUMBER: _builtins.int
+ name: _builtins.str
+ 'Name of an arm'
+
+ @_builtins.property
+ def extra(self) -> _struct_pb2.Struct:
+ """Additional arguments to the method"""
+
+ def __init__(self, *, name: _builtins.str=..., extra: _struct_pb2.Struct | None=...) -> None:
+ ...
+ _HasFieldArgType: _TypeAlias = _typing.Literal['extra', b'extra']
+
+ def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool:
+ ...
+ _ClearFieldArgType: _TypeAlias = _typing.Literal['extra', b'extra', 'name', b'name']
+
+ def ClearField(self, field_name: _ClearFieldArgType) -> None:
+ ...
+Global___GetPropertiesRequest: _TypeAlias = GetPropertiesRequest
+
+@_typing.final
+class GetPropertiesResponse(_message.Message):
+ DESCRIPTOR: _descriptor.Descriptor
+ SUPPORT_MANUAL_MODE_FIELD_NUMBER: _builtins.int
+ SUPPORT_CARTESIAN_COMMANDS_FIELD_NUMBER: _builtins.int
+ support_manual_mode: _builtins.bool
+ 'True if the arm supports software-enabled manual mode'
+ support_cartesian_commands: _builtins.bool
+ 'True if the arm supports direct cartesian commands (MoveToPosition is implemented)'
+
+ def __init__(self, *, support_manual_mode: _builtins.bool=..., support_cartesian_commands: _builtins.bool=...) -> None:
+ ...
+ _ClearFieldArgType: _TypeAlias = _typing.Literal['support_cartesian_commands', b'support_cartesian_commands', 'support_manual_mode', b'support_manual_mode']
+
+ def ClearField(self, field_name: _ClearFieldArgType) -> None:
+ ...
+Global___GetPropertiesResponse: _TypeAlias = GetPropertiesResponse
\ No newline at end of file
diff --git a/src/viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py b/src/viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py
index b3bfab3c9..8bc395c98 100644
--- a/src/viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py
+++ b/src/viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py
@@ -9,13 +9,15 @@
from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
from google.rpc import status_pb2 as google_dot_rpc_dot_status__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#proto/rpc/webrtc/v1/signaling.proto\x12\x13proto.rpc.webrtc.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/rpc/status.proto"\xdf\x01\n\x0cICECandidate\x12\x1c\n\tcandidate\x18\x01 \x01(\tR\tcandidate\x12\x1c\n\x07sdp_mid\x18\x02 \x01(\tH\x00R\x06sdpMid\x88\x01\x01\x12+\n\x0fsdpm_line_index\x18\x03 \x01(\rH\x01R\rsdpmLineIndex\x88\x01\x01\x120\n\x11username_fragment\x18\x04 \x01(\tH\x02R\x10usernameFragment\x88\x01\x01B\n\n\x08_sdp_midB\x12\n\x10_sdpm_line_indexB\x14\n\x12_username_fragment"H\n\x0bCallRequest\x12\x10\n\x03sdp\x18\x01 \x01(\tR\x03sdp\x12\'\n\x0fdisable_trickle\x18\x02 \x01(\x08R\x0edisableTrickle")\n\x15CallResponseInitStage\x12\x10\n\x03sdp\x18\x01 \x01(\tR\x03sdp"Z\n\x17CallResponseUpdateStage\x12?\n\tcandidate\x18\x01 \x01(\x0b2!.proto.rpc.webrtc.v1.ICECandidateR\tcandidate"\xb5\x01\n\x0cCallResponse\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12@\n\x04init\x18\x02 \x01(\x0b2*.proto.rpc.webrtc.v1.CallResponseInitStageH\x00R\x04init\x12F\n\x06update\x18\x03 \x01(\x0b2,.proto.rpc.webrtc.v1.CallResponseUpdateStageH\x00R\x06updateB\x07\n\x05stage"\xb6\x01\n\x11CallUpdateRequest\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12A\n\tcandidate\x18\x02 \x01(\x0b2!.proto.rpc.webrtc.v1.ICECandidateH\x00R\tcandidate\x12\x14\n\x04done\x18\x03 \x01(\x08H\x00R\x04done\x12*\n\x05error\x18\x04 \x01(\x0b2\x12.google.rpc.StatusH\x00R\x05errorB\x08\n\x06update"\x14\n\x12CallUpdateResponse"[\n\tICEServer\x12\x12\n\x04urls\x18\x01 \x03(\tR\x04urls\x12\x1a\n\x08username\x18\x02 \x01(\tR\x08username\x12\x1e\n\ncredential\x18\x03 \x01(\tR\ncredential"\x8d\x01\n\x0cWebRTCConfig\x12T\n\x16additional_ice_servers\x18\x01 \x03(\x0b2\x1e.proto.rpc.webrtc.v1.ICEServerR\x14additionalIceServers\x12\'\n\x0fdisable_trickle\x18\x02 \x01(\x08R\x0edisableTrickle"\xc0\x01\n\x16AnswerRequestInitStage\x12\x10\n\x03sdp\x18\x01 \x01(\tR\x03sdp\x12J\n\x0foptional_config\x18\x02 \x01(\x0b2!.proto.rpc.webrtc.v1.WebRTCConfigR\x0eoptionalConfig\x12;\n\x08deadline\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampH\x00R\x08deadline\x88\x01\x01B\x0b\n\t_deadline"[\n\x18AnswerRequestUpdateStage\x12?\n\tcandidate\x18\x01 \x01(\x0b2!.proto.rpc.webrtc.v1.ICECandidateR\tcandidate"\x18\n\x16AnswerRequestDoneStage"E\n\x17AnswerRequestErrorStage\x12*\n\x06status\x18\x01 \x01(\x0b2\x12.google.rpc.StatusR\x06status"\x1d\n\x1bAnswerRequestHeartbeatStage"\x93\x03\n\rAnswerRequest\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12A\n\x04init\x18\x02 \x01(\x0b2+.proto.rpc.webrtc.v1.AnswerRequestInitStageH\x00R\x04init\x12G\n\x06update\x18\x03 \x01(\x0b2-.proto.rpc.webrtc.v1.AnswerRequestUpdateStageH\x00R\x06update\x12A\n\x04done\x18\x04 \x01(\x0b2+.proto.rpc.webrtc.v1.AnswerRequestDoneStageH\x00R\x04done\x12D\n\x05error\x18\x05 \x01(\x0b2,.proto.rpc.webrtc.v1.AnswerRequestErrorStageH\x00R\x05error\x12P\n\theartbeat\x18\x06 \x01(\x0b20.proto.rpc.webrtc.v1.AnswerRequestHeartbeatStageH\x00R\theartbeatB\x07\n\x05stage"+\n\x17AnswerResponseInitStage\x12\x10\n\x03sdp\x18\x01 \x01(\tR\x03sdp"\\\n\x19AnswerResponseUpdateStage\x12?\n\tcandidate\x18\x01 \x01(\x0b2!.proto.rpc.webrtc.v1.ICECandidateR\tcandidate"\x19\n\x17AnswerResponseDoneStage"F\n\x18AnswerResponseErrorStage\x12*\n\x06status\x18\x01 \x01(\x0b2\x12.google.rpc.StatusR\x06status"\xc6\x02\n\x0eAnswerResponse\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12B\n\x04init\x18\x02 \x01(\x0b2,.proto.rpc.webrtc.v1.AnswerResponseInitStageH\x00R\x04init\x12H\n\x06update\x18\x03 \x01(\x0b2..proto.rpc.webrtc.v1.AnswerResponseUpdateStageH\x00R\x06update\x12B\n\x04done\x18\x04 \x01(\x0b2,.proto.rpc.webrtc.v1.AnswerResponseDoneStageH\x00R\x04done\x12E\n\x05error\x18\x05 \x01(\x0b2-.proto.rpc.webrtc.v1.AnswerResponseErrorStageH\x00R\x05errorB\x07\n\x05stage"\x1d\n\x1bOptionalWebRTCConfigRequest"Y\n\x1cOptionalWebRTCConfigResponse\x129\n\x06config\x18\x01 \x01(\x0b2!.proto.rpc.webrtc.v1.WebRTCConfigR\x06config"u\n\x13ConnectionCandidate\x129\n\x04type\x18\x01 \x01(\x0e2%.proto.rpc.webrtc.v1.ICECandidateTypeR\x04type\x12#\n\rrelay_address\x18\x02 \x01(\tR\x0crelayAddress"\x81\x03\n\x1fReportConnectionMetadataRequest\x12>\n\x05local\x18\x01 \x01(\x0b2(.proto.rpc.webrtc.v1.ConnectionCandidateR\x05local\x12@\n\x06remote\x18\x02 \x01(\x0b2(.proto.rpc.webrtc.v1.ConnectionCandidateR\x06remote\x12C\n\rreached_stage\x18\x03 \x01(\x0e2\x1e.proto.rpc.webrtc.v1.DialStageR\x0creachedStage\x12\x1f\n\x0bduration_ms\x18\x04 \x01(\rR\ndurationMs\x12S\n\x0esignaling_path\x18\x05 \x01(\x0e2,.proto.rpc.webrtc.v1.ConnectionSignalingPathR\rsignalingPath\x12!\n\x0cfailure_code\x18\x06 \x01(\x05R\x0bfailureCode""\n ReportConnectionMetadataResponse*\x8e\x01\n\x10ICECandidateType\x12"\n\x1eICE_CANDIDATE_TYPE_UNSPECIFIED\x10\x00\x12\x1b\n\x17ICE_CANDIDATE_TYPE_HOST\x10\x01\x12\x1b\n\x17ICE_CANDIDATE_TYPE_STUN\x10\x02\x12\x1c\n\x18ICE_CANDIDATE_TYPE_RELAY\x10\x03*\xf8\x01\n\tDialStage\x12\x1a\n\x16DIAL_STAGE_UNSPECIFIED\x10\x00\x12"\n\x1eDIAL_STAGE_SIGNALING_CONNECTED\x10\x01\x12\x1d\n\x19DIAL_STAGE_CONFIG_FETCHED\x10\x02\x12\x19\n\x15DIAL_STAGE_OFFER_SENT\x10\x03\x12\x1e\n\x1aDIAL_STAGE_ANSWER_RECEIVED\x10\x04\x12\x1c\n\x18DIAL_STAGE_ICE_CONNECTED\x10\x05\x12\x1d\n\x19DIAL_STAGE_DTLS_CONNECTED\x10\x06\x12\x14\n\x10DIAL_STAGE_READY\x10\x07*\xc1\x01\n\x17ConnectionSignalingPath\x12)\n%CONNECTION_SIGNALING_PATH_UNSPECIFIED\x10\x00\x12,\n(CONNECTION_SIGNALING_PATH_CLOUD_SIGNALED\x10\x01\x12(\n$CONNECTION_SIGNALING_PATH_MDNS_LOCAL\x10\x02\x12#\n\x1fCONNECTION_SIGNALING_PATH_LOCAL\x10\x032\xc3\x05\n\x10SignalingService\x12j\n\x04Call\x12 .proto.rpc.webrtc.v1.CallRequest\x1a!.proto.rpc.webrtc.v1.CallResponse"\x1b\x82\xd3\xe4\x93\x02\x15"\x13/rpc/webrtc/v1/call0\x01\x12\x81\x01\n\nCallUpdate\x12&.proto.rpc.webrtc.v1.CallUpdateRequest\x1a\'.proto.rpc.webrtc.v1.CallUpdateResponse""\x82\xd3\xe4\x93\x02\x1c\x1a\x1a/rpc/webrtc/v1/call_update\x12U\n\x06Answer\x12#.proto.rpc.webrtc.v1.AnswerResponse\x1a".proto.rpc.webrtc.v1.AnswerRequest(\x010\x01\x12\xaa\x01\n\x14OptionalWebRTCConfig\x120.proto.rpc.webrtc.v1.OptionalWebRTCConfigRequest\x1a1.proto.rpc.webrtc.v1.OptionalWebRTCConfigResponse"-\x82\xd3\xe4\x93\x02\'\x12%/rpc/webrtc/v1/optional_webrtc_config\x12\xba\x01\n\x18ReportConnectionMetadata\x124.proto.rpc.webrtc.v1.ReportConnectionMetadataRequest\x1a5.proto.rpc.webrtc.v1.ReportConnectionMetadataResponse"1\x82\xd3\xe4\x93\x02+")/rpc/webrtc/v1/report_connection_metadataB\'Z%go.viam.com/utils/proto/rpc/webrtc/v1b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#proto/rpc/webrtc/v1/signaling.proto\x12\x13proto.rpc.webrtc.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17google/rpc/status.proto"\xdf\x01\n\x0cICECandidate\x12\x1c\n\tcandidate\x18\x01 \x01(\tR\tcandidate\x12\x1c\n\x07sdp_mid\x18\x02 \x01(\tH\x00R\x06sdpMid\x88\x01\x01\x12+\n\x0fsdpm_line_index\x18\x03 \x01(\rH\x01R\rsdpmLineIndex\x88\x01\x01\x120\n\x11username_fragment\x18\x04 \x01(\tH\x02R\x10usernameFragment\x88\x01\x01B\n\n\x08_sdp_midB\x12\n\x10_sdpm_line_indexB\x14\n\x12_username_fragment"H\n\x0bCallRequest\x12\x10\n\x03sdp\x18\x01 \x01(\tR\x03sdp\x12\'\n\x0fdisable_trickle\x18\x02 \x01(\x08R\x0edisableTrickle")\n\x15CallResponseInitStage\x12\x10\n\x03sdp\x18\x01 \x01(\tR\x03sdp"Z\n\x17CallResponseUpdateStage\x12?\n\tcandidate\x18\x01 \x01(\x0b2!.proto.rpc.webrtc.v1.ICECandidateR\tcandidate"\xb5\x01\n\x0cCallResponse\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12@\n\x04init\x18\x02 \x01(\x0b2*.proto.rpc.webrtc.v1.CallResponseInitStageH\x00R\x04init\x12F\n\x06update\x18\x03 \x01(\x0b2,.proto.rpc.webrtc.v1.CallResponseUpdateStageH\x00R\x06updateB\x07\n\x05stage"\xb6\x01\n\x11CallUpdateRequest\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12A\n\tcandidate\x18\x02 \x01(\x0b2!.proto.rpc.webrtc.v1.ICECandidateH\x00R\tcandidate\x12\x14\n\x04done\x18\x03 \x01(\x08H\x00R\x04done\x12*\n\x05error\x18\x04 \x01(\x0b2\x12.google.rpc.StatusH\x00R\x05errorB\x08\n\x06update"\x14\n\x12CallUpdateResponse"[\n\tICEServer\x12\x12\n\x04urls\x18\x01 \x03(\tR\x04urls\x12\x1a\n\x08username\x18\x02 \x01(\tR\x08username\x12\x1e\n\ncredential\x18\x03 \x01(\tR\ncredential"\x8d\x01\n\x0cWebRTCConfig\x12T\n\x16additional_ice_servers\x18\x01 \x03(\x0b2\x1e.proto.rpc.webrtc.v1.ICEServerR\x14additionalIceServers\x12\'\n\x0fdisable_trickle\x18\x02 \x01(\x08R\x0edisableTrickle"\xac\x03\n\x16AnswerRequestInitStage\x12\x10\n\x03sdp\x18\x01 \x01(\tR\x03sdp\x12J\n\x0foptional_config\x18\x02 \x01(\x0b2!.proto.rpc.webrtc.v1.WebRTCConfigR\x0eoptionalConfig\x12;\n\x08deadline\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampH\x00R\x08deadline\x88\x01\x01\x12,\n\x12caller_auth_entity\x18\x04 \x01(\tR\x10callerAuthEntity\x12u\n\x14caller_auth_metadata\x18\x05 \x03(\x0b2C.proto.rpc.webrtc.v1.AnswerRequestInitStage.CallerAuthMetadataEntryR\x12callerAuthMetadata\x1aE\n\x17CallerAuthMetadataEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B\x0b\n\t_deadline"[\n\x18AnswerRequestUpdateStage\x12?\n\tcandidate\x18\x01 \x01(\x0b2!.proto.rpc.webrtc.v1.ICECandidateR\tcandidate"\x18\n\x16AnswerRequestDoneStage"E\n\x17AnswerRequestErrorStage\x12*\n\x06status\x18\x01 \x01(\x0b2\x12.google.rpc.StatusR\x06status"\x1d\n\x1bAnswerRequestHeartbeatStage"\x93\x03\n\rAnswerRequest\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12A\n\x04init\x18\x02 \x01(\x0b2+.proto.rpc.webrtc.v1.AnswerRequestInitStageH\x00R\x04init\x12G\n\x06update\x18\x03 \x01(\x0b2-.proto.rpc.webrtc.v1.AnswerRequestUpdateStageH\x00R\x06update\x12A\n\x04done\x18\x04 \x01(\x0b2+.proto.rpc.webrtc.v1.AnswerRequestDoneStageH\x00R\x04done\x12D\n\x05error\x18\x05 \x01(\x0b2,.proto.rpc.webrtc.v1.AnswerRequestErrorStageH\x00R\x05error\x12P\n\theartbeat\x18\x06 \x01(\x0b20.proto.rpc.webrtc.v1.AnswerRequestHeartbeatStageH\x00R\theartbeatB\x07\n\x05stage"+\n\x17AnswerResponseInitStage\x12\x10\n\x03sdp\x18\x01 \x01(\tR\x03sdp"\\\n\x19AnswerResponseUpdateStage\x12?\n\tcandidate\x18\x01 \x01(\x0b2!.proto.rpc.webrtc.v1.ICECandidateR\tcandidate"\x19\n\x17AnswerResponseDoneStage"F\n\x18AnswerResponseErrorStage\x12*\n\x06status\x18\x01 \x01(\x0b2\x12.google.rpc.StatusR\x06status"\xc6\x02\n\x0eAnswerResponse\x12\x12\n\x04uuid\x18\x01 \x01(\tR\x04uuid\x12B\n\x04init\x18\x02 \x01(\x0b2,.proto.rpc.webrtc.v1.AnswerResponseInitStageH\x00R\x04init\x12H\n\x06update\x18\x03 \x01(\x0b2..proto.rpc.webrtc.v1.AnswerResponseUpdateStageH\x00R\x06update\x12B\n\x04done\x18\x04 \x01(\x0b2,.proto.rpc.webrtc.v1.AnswerResponseDoneStageH\x00R\x04done\x12E\n\x05error\x18\x05 \x01(\x0b2-.proto.rpc.webrtc.v1.AnswerResponseErrorStageH\x00R\x05errorB\x07\n\x05stage"\x1d\n\x1bOptionalWebRTCConfigRequest"Y\n\x1cOptionalWebRTCConfigResponse\x129\n\x06config\x18\x01 \x01(\x0b2!.proto.rpc.webrtc.v1.WebRTCConfigR\x06config"u\n\x13ConnectionCandidate\x129\n\x04type\x18\x01 \x01(\x0e2%.proto.rpc.webrtc.v1.ICECandidateTypeR\x04type\x12#\n\rrelay_address\x18\x02 \x01(\tR\x0crelayAddress"\x81\x03\n\x1fReportConnectionMetadataRequest\x12>\n\x05local\x18\x01 \x01(\x0b2(.proto.rpc.webrtc.v1.ConnectionCandidateR\x05local\x12@\n\x06remote\x18\x02 \x01(\x0b2(.proto.rpc.webrtc.v1.ConnectionCandidateR\x06remote\x12C\n\rreached_stage\x18\x03 \x01(\x0e2\x1e.proto.rpc.webrtc.v1.DialStageR\x0creachedStage\x12\x1f\n\x0bduration_ms\x18\x04 \x01(\rR\ndurationMs\x12S\n\x0esignaling_path\x18\x05 \x01(\x0e2,.proto.rpc.webrtc.v1.ConnectionSignalingPathR\rsignalingPath\x12!\n\x0cfailure_code\x18\x06 \x01(\x05R\x0bfailureCode""\n ReportConnectionMetadataResponse*\x8e\x01\n\x10ICECandidateType\x12"\n\x1eICE_CANDIDATE_TYPE_UNSPECIFIED\x10\x00\x12\x1b\n\x17ICE_CANDIDATE_TYPE_HOST\x10\x01\x12\x1b\n\x17ICE_CANDIDATE_TYPE_STUN\x10\x02\x12\x1c\n\x18ICE_CANDIDATE_TYPE_RELAY\x10\x03*\xf8\x01\n\tDialStage\x12\x1a\n\x16DIAL_STAGE_UNSPECIFIED\x10\x00\x12"\n\x1eDIAL_STAGE_SIGNALING_CONNECTED\x10\x01\x12\x1d\n\x19DIAL_STAGE_CONFIG_FETCHED\x10\x02\x12\x19\n\x15DIAL_STAGE_OFFER_SENT\x10\x03\x12\x1e\n\x1aDIAL_STAGE_ANSWER_RECEIVED\x10\x04\x12\x1c\n\x18DIAL_STAGE_ICE_CONNECTED\x10\x05\x12\x1d\n\x19DIAL_STAGE_DTLS_CONNECTED\x10\x06\x12\x14\n\x10DIAL_STAGE_READY\x10\x07*\xc1\x01\n\x17ConnectionSignalingPath\x12)\n%CONNECTION_SIGNALING_PATH_UNSPECIFIED\x10\x00\x12,\n(CONNECTION_SIGNALING_PATH_CLOUD_SIGNALED\x10\x01\x12(\n$CONNECTION_SIGNALING_PATH_MDNS_LOCAL\x10\x02\x12#\n\x1fCONNECTION_SIGNALING_PATH_LOCAL\x10\x032\xc3\x05\n\x10SignalingService\x12j\n\x04Call\x12 .proto.rpc.webrtc.v1.CallRequest\x1a!.proto.rpc.webrtc.v1.CallResponse"\x1b\x82\xd3\xe4\x93\x02\x15"\x13/rpc/webrtc/v1/call0\x01\x12\x81\x01\n\nCallUpdate\x12&.proto.rpc.webrtc.v1.CallUpdateRequest\x1a\'.proto.rpc.webrtc.v1.CallUpdateResponse""\x82\xd3\xe4\x93\x02\x1c\x1a\x1a/rpc/webrtc/v1/call_update\x12U\n\x06Answer\x12#.proto.rpc.webrtc.v1.AnswerResponse\x1a".proto.rpc.webrtc.v1.AnswerRequest(\x010\x01\x12\xaa\x01\n\x14OptionalWebRTCConfig\x120.proto.rpc.webrtc.v1.OptionalWebRTCConfigRequest\x1a1.proto.rpc.webrtc.v1.OptionalWebRTCConfigResponse"-\x82\xd3\xe4\x93\x02\'\x12%/rpc/webrtc/v1/optional_webrtc_config\x12\xba\x01\n\x18ReportConnectionMetadata\x124.proto.rpc.webrtc.v1.ReportConnectionMetadataRequest\x1a5.proto.rpc.webrtc.v1.ReportConnectionMetadataResponse"1\x82\xd3\xe4\x93\x02+")/rpc/webrtc/v1/report_connection_metadataB\'Z%go.viam.com/utils/proto/rpc/webrtc/v1b\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'proto.rpc.webrtc.v1.signaling_pb2', _globals)
if not _descriptor._USE_C_DESCRIPTORS:
_globals['DESCRIPTOR']._loaded_options = None
_globals['DESCRIPTOR']._serialized_options = b'Z%go.viam.com/utils/proto/rpc/webrtc/v1'
+ _globals['_ANSWERREQUESTINITSTAGE_CALLERAUTHMETADATAENTRY']._loaded_options = None
+ _globals['_ANSWERREQUESTINITSTAGE_CALLERAUTHMETADATAENTRY']._serialized_options = b'8\x01'
_globals['_SIGNALINGSERVICE'].methods_by_name['Call']._loaded_options = None
_globals['_SIGNALINGSERVICE'].methods_by_name['Call']._serialized_options = b'\x82\xd3\xe4\x93\x02\x15"\x13/rpc/webrtc/v1/call'
_globals['_SIGNALINGSERVICE'].methods_by_name['CallUpdate']._loaded_options = None
@@ -24,12 +26,12 @@
_globals['_SIGNALINGSERVICE'].methods_by_name['OptionalWebRTCConfig']._serialized_options = b"\x82\xd3\xe4\x93\x02'\x12%/rpc/webrtc/v1/optional_webrtc_config"
_globals['_SIGNALINGSERVICE'].methods_by_name['ReportConnectionMetadata']._loaded_options = None
_globals['_SIGNALINGSERVICE'].methods_by_name['ReportConnectionMetadata']._serialized_options = b'\x82\xd3\xe4\x93\x02+")/rpc/webrtc/v1/report_connection_metadata'
- _globals['_ICECANDIDATETYPE']._serialized_start = 3266
- _globals['_ICECANDIDATETYPE']._serialized_end = 3408
- _globals['_DIALSTAGE']._serialized_start = 3411
- _globals['_DIALSTAGE']._serialized_end = 3659
- _globals['_CONNECTIONSIGNALINGPATH']._serialized_start = 3662
- _globals['_CONNECTIONSIGNALINGPATH']._serialized_end = 3855
+ _globals['_ICECANDIDATETYPE']._serialized_start = 3502
+ _globals['_ICECANDIDATETYPE']._serialized_end = 3644
+ _globals['_DIALSTAGE']._serialized_start = 3647
+ _globals['_DIALSTAGE']._serialized_end = 3895
+ _globals['_CONNECTIONSIGNALINGPATH']._serialized_start = 3898
+ _globals['_CONNECTIONSIGNALINGPATH']._serialized_end = 4091
_globals['_ICECANDIDATE']._serialized_start = 149
_globals['_ICECANDIDATE']._serialized_end = 372
_globals['_CALLREQUEST']._serialized_start = 374
@@ -49,36 +51,38 @@
_globals['_WEBRTCCONFIG']._serialized_start = 1068
_globals['_WEBRTCCONFIG']._serialized_end = 1209
_globals['_ANSWERREQUESTINITSTAGE']._serialized_start = 1212
- _globals['_ANSWERREQUESTINITSTAGE']._serialized_end = 1404
- _globals['_ANSWERREQUESTUPDATESTAGE']._serialized_start = 1406
- _globals['_ANSWERREQUESTUPDATESTAGE']._serialized_end = 1497
- _globals['_ANSWERREQUESTDONESTAGE']._serialized_start = 1499
- _globals['_ANSWERREQUESTDONESTAGE']._serialized_end = 1523
- _globals['_ANSWERREQUESTERRORSTAGE']._serialized_start = 1525
- _globals['_ANSWERREQUESTERRORSTAGE']._serialized_end = 1594
- _globals['_ANSWERREQUESTHEARTBEATSTAGE']._serialized_start = 1596
- _globals['_ANSWERREQUESTHEARTBEATSTAGE']._serialized_end = 1625
- _globals['_ANSWERREQUEST']._serialized_start = 1628
- _globals['_ANSWERREQUEST']._serialized_end = 2031
- _globals['_ANSWERRESPONSEINITSTAGE']._serialized_start = 2033
- _globals['_ANSWERRESPONSEINITSTAGE']._serialized_end = 2076
- _globals['_ANSWERRESPONSEUPDATESTAGE']._serialized_start = 2078
- _globals['_ANSWERRESPONSEUPDATESTAGE']._serialized_end = 2170
- _globals['_ANSWERRESPONSEDONESTAGE']._serialized_start = 2172
- _globals['_ANSWERRESPONSEDONESTAGE']._serialized_end = 2197
- _globals['_ANSWERRESPONSEERRORSTAGE']._serialized_start = 2199
- _globals['_ANSWERRESPONSEERRORSTAGE']._serialized_end = 2269
- _globals['_ANSWERRESPONSE']._serialized_start = 2272
- _globals['_ANSWERRESPONSE']._serialized_end = 2598
- _globals['_OPTIONALWEBRTCCONFIGREQUEST']._serialized_start = 2600
- _globals['_OPTIONALWEBRTCCONFIGREQUEST']._serialized_end = 2629
- _globals['_OPTIONALWEBRTCCONFIGRESPONSE']._serialized_start = 2631
- _globals['_OPTIONALWEBRTCCONFIGRESPONSE']._serialized_end = 2720
- _globals['_CONNECTIONCANDIDATE']._serialized_start = 2722
- _globals['_CONNECTIONCANDIDATE']._serialized_end = 2839
- _globals['_REPORTCONNECTIONMETADATAREQUEST']._serialized_start = 2842
- _globals['_REPORTCONNECTIONMETADATAREQUEST']._serialized_end = 3227
- _globals['_REPORTCONNECTIONMETADATARESPONSE']._serialized_start = 3229
- _globals['_REPORTCONNECTIONMETADATARESPONSE']._serialized_end = 3263
- _globals['_SIGNALINGSERVICE']._serialized_start = 3858
- _globals['_SIGNALINGSERVICE']._serialized_end = 4565
\ No newline at end of file
+ _globals['_ANSWERREQUESTINITSTAGE']._serialized_end = 1640
+ _globals['_ANSWERREQUESTINITSTAGE_CALLERAUTHMETADATAENTRY']._serialized_start = 1558
+ _globals['_ANSWERREQUESTINITSTAGE_CALLERAUTHMETADATAENTRY']._serialized_end = 1627
+ _globals['_ANSWERREQUESTUPDATESTAGE']._serialized_start = 1642
+ _globals['_ANSWERREQUESTUPDATESTAGE']._serialized_end = 1733
+ _globals['_ANSWERREQUESTDONESTAGE']._serialized_start = 1735
+ _globals['_ANSWERREQUESTDONESTAGE']._serialized_end = 1759
+ _globals['_ANSWERREQUESTERRORSTAGE']._serialized_start = 1761
+ _globals['_ANSWERREQUESTERRORSTAGE']._serialized_end = 1830
+ _globals['_ANSWERREQUESTHEARTBEATSTAGE']._serialized_start = 1832
+ _globals['_ANSWERREQUESTHEARTBEATSTAGE']._serialized_end = 1861
+ _globals['_ANSWERREQUEST']._serialized_start = 1864
+ _globals['_ANSWERREQUEST']._serialized_end = 2267
+ _globals['_ANSWERRESPONSEINITSTAGE']._serialized_start = 2269
+ _globals['_ANSWERRESPONSEINITSTAGE']._serialized_end = 2312
+ _globals['_ANSWERRESPONSEUPDATESTAGE']._serialized_start = 2314
+ _globals['_ANSWERRESPONSEUPDATESTAGE']._serialized_end = 2406
+ _globals['_ANSWERRESPONSEDONESTAGE']._serialized_start = 2408
+ _globals['_ANSWERRESPONSEDONESTAGE']._serialized_end = 2433
+ _globals['_ANSWERRESPONSEERRORSTAGE']._serialized_start = 2435
+ _globals['_ANSWERRESPONSEERRORSTAGE']._serialized_end = 2505
+ _globals['_ANSWERRESPONSE']._serialized_start = 2508
+ _globals['_ANSWERRESPONSE']._serialized_end = 2834
+ _globals['_OPTIONALWEBRTCCONFIGREQUEST']._serialized_start = 2836
+ _globals['_OPTIONALWEBRTCCONFIGREQUEST']._serialized_end = 2865
+ _globals['_OPTIONALWEBRTCCONFIGRESPONSE']._serialized_start = 2867
+ _globals['_OPTIONALWEBRTCCONFIGRESPONSE']._serialized_end = 2956
+ _globals['_CONNECTIONCANDIDATE']._serialized_start = 2958
+ _globals['_CONNECTIONCANDIDATE']._serialized_end = 3075
+ _globals['_REPORTCONNECTIONMETADATAREQUEST']._serialized_start = 3078
+ _globals['_REPORTCONNECTIONMETADATAREQUEST']._serialized_end = 3463
+ _globals['_REPORTCONNECTIONMETADATARESPONSE']._serialized_start = 3465
+ _globals['_REPORTCONNECTIONMETADATARESPONSE']._serialized_end = 3499
+ _globals['_SIGNALINGSERVICE']._serialized_start = 4094
+ _globals['_SIGNALINGSERVICE']._serialized_end = 4801
\ No newline at end of file
diff --git a/src/viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi b/src/viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi
index ea5781eb7..7f56681bd 100644
--- a/src/viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi
+++ b/src/viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi
@@ -345,10 +345,29 @@ class AnswerRequestInitStage(_message.Message):
callers initial SDP request to the controlled (answerer) side.
"""
DESCRIPTOR: _descriptor.Descriptor
+
+ @_typing.final
+ class CallerAuthMetadataEntry(_message.Message):
+ DESCRIPTOR: _descriptor.Descriptor
+ KEY_FIELD_NUMBER: _builtins.int
+ VALUE_FIELD_NUMBER: _builtins.int
+ key: _builtins.str
+ value: _builtins.str
+
+ def __init__(self, *, key: _builtins.str=..., value: _builtins.str=...) -> None:
+ ...
+ _ClearFieldArgType: _TypeAlias = _typing.Literal['key', b'key', 'value', b'value']
+
+ def ClearField(self, field_name: _ClearFieldArgType) -> None:
+ ...
SDP_FIELD_NUMBER: _builtins.int
OPTIONAL_CONFIG_FIELD_NUMBER: _builtins.int
DEADLINE_FIELD_NUMBER: _builtins.int
+ CALLER_AUTH_ENTITY_FIELD_NUMBER: _builtins.int
+ CALLER_AUTH_METADATA_FIELD_NUMBER: _builtins.int
sdp: _builtins.str
+ caller_auth_entity: _builtins.str
+ "caller_auth_entity is the caller's authenticated entity (its JWT subject), extracted\n from the caller's auth token by the signaling server. Only the caller's identity is\n forwarded to the answerer, not its bearer token. Empty when the caller was\n unauthenticated.\n "
@_builtins.property
def optional_config(self) -> Global___WebRTCConfig:
@@ -358,13 +377,19 @@ class AnswerRequestInitStage(_message.Message):
def deadline(self) -> _timestamp_pb2.Timestamp:
...
- def __init__(self, *, sdp: _builtins.str=..., optional_config: Global___WebRTCConfig | None=..., deadline: _timestamp_pb2.Timestamp | None=...) -> None:
+ @_builtins.property
+ def caller_auth_metadata(self) -> _containers.ScalarMap[_builtins.str, _builtins.str]:
+ """caller_auth_metadata is the caller's auth metadata (its rpc_auth_md claim), extracted
+ from the caller's auth token by the signaling server.
+ """
+
+ def __init__(self, *, sdp: _builtins.str=..., optional_config: Global___WebRTCConfig | None=..., deadline: _timestamp_pb2.Timestamp | None=..., caller_auth_entity: _builtins.str=..., caller_auth_metadata: _abc.Mapping[_builtins.str, _builtins.str] | None=...) -> None:
...
_HasFieldArgType: _TypeAlias = _typing.Literal['_deadline', b'_deadline', 'deadline', b'deadline', 'optional_config', b'optional_config']
def HasField(self, field_name: _HasFieldArgType) -> _builtins.bool:
...
- _ClearFieldArgType: _TypeAlias = _typing.Literal['_deadline', b'_deadline', 'deadline', b'deadline', 'optional_config', b'optional_config', 'sdp', b'sdp']
+ _ClearFieldArgType: _TypeAlias = _typing.Literal['_deadline', b'_deadline', 'caller_auth_entity', b'caller_auth_entity', 'caller_auth_metadata', b'caller_auth_metadata', 'deadline', b'deadline', 'optional_config', b'optional_config', 'sdp', b'sdp']
def ClearField(self, field_name: _ClearFieldArgType) -> None:
...
diff --git a/src/viam/proto/component/arm/__init__.py b/src/viam/proto/component/arm/__init__.py
index cf5a4c821..9567a8646 100644
--- a/src/viam/proto/component/arm/__init__.py
+++ b/src/viam/proto/component/arm/__init__.py
@@ -9,6 +9,10 @@
GetEndPositionResponse,
GetJointPositionsRequest,
GetJointPositionsResponse,
+ GetManualModeRequest,
+ GetManualModeResponse,
+ GetPropertiesRequest,
+ GetPropertiesResponse,
IsMovingRequest,
IsMovingResponse,
JointAccelerations,
@@ -23,6 +27,8 @@
MoveToJointPositionsResponse,
MoveToPositionRequest,
MoveToPositionResponse,
+ SetManualModeRequest,
+ SetManualModeResponse,
Status,
StopRequest,
StopResponse,
@@ -37,6 +43,10 @@
"GetEndPositionResponse",
"GetJointPositionsRequest",
"GetJointPositionsResponse",
+ "GetManualModeRequest",
+ "GetManualModeResponse",
+ "GetPropertiesRequest",
+ "GetPropertiesResponse",
"IsMovingRequest",
"IsMovingResponse",
"JointAccelerations",
@@ -51,6 +61,8 @@
"MoveToJointPositionsResponse",
"MoveToPositionRequest",
"MoveToPositionResponse",
+ "SetManualModeRequest",
+ "SetManualModeResponse",
"Status",
"StopRequest",
"StopResponse",
diff --git a/src/viam/version_metadata.py b/src/viam/version_metadata.py
index 97e96e6da..a4064f348 100644
--- a/src/viam/version_metadata.py
+++ b/src/viam/version_metadata.py
@@ -1,4 +1,4 @@
__version__ = "0.81.0"
-API_VERSION = "v0.1.578"
+API_VERSION = "v0.1.579"
SDK_VERSION = __version__
diff --git a/tests/mocks/components.py b/tests/mocks/components.py
index e5acfca5d..5c37746a1 100644
--- a/tests/mocks/components.py
+++ b/tests/mocks/components.py
@@ -155,6 +155,19 @@ async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeou
self.timeout = timeout
return self.geometries
+ async def set_manual_mode(
+ self, manual_mode: bool, enabled_for: int = 0, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs
+ ):
+ raise NotImplementedError()
+
+ async def get_manual_mode(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> bool:
+ raise NotImplementedError()
+
+ async def get_properties(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> Arm.Properties:
+ self.extra = extra
+ self.timeout = timeout
+ return Arm.Properties(support_manual_mode=False, support_cartesian_commands=True)
+
async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None, **kwargs) -> Mapping[str, ValueTypes]:
return {"command": command}
diff --git a/tests/test_arm.py b/tests/test_arm.py
index b451554ca..633f69850 100644
--- a/tests/test_arm.py
+++ b/tests/test_arm.py
@@ -1,4 +1,5 @@
import pytest
+from grpclib import GRPCError
from grpclib.testing import ChannelFor
from viam.components.arm import ArmClient, KinematicsFileFormat
@@ -22,6 +23,9 @@
GetEndPositionResponse,
GetJointPositionsRequest,
GetJointPositionsResponse,
+ GetManualModeRequest,
+ GetPropertiesRequest,
+ GetPropertiesResponse,
IsMovingRequest,
IsMovingResponse,
JointPositions,
@@ -29,6 +33,7 @@
MoveThroughJointPositionsRequest,
MoveToJointPositionsRequest,
MoveToPositionRequest,
+ SetManualModeRequest,
StopRequest,
)
from viam.resource.manager import ResourceManager
@@ -93,6 +98,19 @@ async def test_get_3d_models(self):
assert models == MODELS_3D
assert self.arm.extra == {"1": "2"}
+ async def test_set_manual_mode(self):
+ with pytest.raises(NotImplementedError):
+ await self.arm.set_manual_mode(True)
+
+ async def test_get_manual_mode(self):
+ with pytest.raises(NotImplementedError):
+ await self.arm.get_manual_mode()
+
+ async def test_get_properties(self):
+ properties = await self.arm.get_properties()
+ assert properties.support_manual_mode is False
+ assert properties.support_cartesian_commands is True
+
async def test_do(self):
command = {"command": "args"}
resp = await self.arm.do_command(command)
@@ -249,6 +267,28 @@ async def test_get_3d_models_empty(self):
finally:
self.arm.models_3d = MODELS_3D
+ async def test_set_manual_mode(self):
+ async with ChannelFor([self.service]) as channel:
+ client = ArmServiceStub(channel)
+ request = SetManualModeRequest(name=self.name, manual_mode=True, enabled_for=30)
+ with pytest.raises(GRPCError):
+ await client.SetManualMode(request)
+
+ async def test_get_manual_mode(self):
+ async with ChannelFor([self.service]) as channel:
+ client = ArmServiceStub(channel)
+ request = GetManualModeRequest(name=self.name)
+ with pytest.raises(GRPCError):
+ await client.GetManualMode(request)
+
+ async def test_get_properties(self):
+ async with ChannelFor([self.service]) as channel:
+ client = ArmServiceStub(channel)
+ request = GetPropertiesRequest(name=self.name)
+ response: GetPropertiesResponse = await client.GetProperties(request)
+ assert response.support_manual_mode is False
+ assert response.support_cartesian_commands is True
+
async def test_extra(self):
async with ChannelFor([self.service]) as channel:
client = ArmServiceStub(channel)
@@ -364,6 +404,26 @@ async def test_get_status(self):
status = await client.get_status()
assert status == {}
+ async def test_set_manual_mode(self):
+ async with ChannelFor([self.service]) as channel:
+ client = ArmClient(self.name, channel)
+ with pytest.raises(GRPCError):
+ await client.set_manual_mode(True, enabled_for=30)
+
+ async def test_get_manual_mode(self):
+ async with ChannelFor([self.service]) as channel:
+ client = ArmClient(self.name, channel)
+ with pytest.raises(GRPCError):
+ await client.get_manual_mode()
+
+ async def test_get_properties(self):
+ async with ChannelFor([self.service]) as channel:
+ client = ArmClient(self.name, channel)
+ properties = await client.get_properties(extra={"1": "2"})
+ assert properties.support_manual_mode is False
+ assert properties.support_cartesian_commands is True
+ assert self.arm.extra == {"1": "2"}
+
async def test_extra(self):
async with ChannelFor([self.service]) as channel:
client = ArmClient(self.name, channel)
diff --git a/tests/test_robot.py b/tests/test_robot.py
index 5acd8a338..207432920 100644
--- a/tests/test_robot.py
+++ b/tests/test_robot.py
@@ -515,6 +515,32 @@ async def get_3d_models(
) -> Mapping[str, Mesh]:
return await self.actual_client.get_3d_models(extra=extra, timeout=timeout)
+ async def set_manual_mode(
+ self,
+ manual_mode: bool,
+ enabled_for: int = 0,
+ *,
+ extra: Optional[Dict[str, Any]] = None,
+ timeout: Optional[float] = None,
+ ):
+ return await self.actual_client.set_manual_mode(manual_mode, enabled_for=enabled_for, extra=extra, timeout=timeout)
+
+ async def get_manual_mode(
+ self,
+ *,
+ extra: Optional[Dict[str, Any]] = None,
+ timeout: Optional[float] = None,
+ ) -> bool:
+ return await self.actual_client.get_manual_mode(extra=extra, timeout=timeout)
+
+ async def get_properties(
+ self,
+ *,
+ extra: Optional[Dict[str, Any]] = None,
+ timeout: Optional[float] = None,
+ ) -> Arm.Properties:
+ return await self.actual_client.get_properties(extra=extra, timeout=timeout)
+
async def get_joint_positions(
self,
*,