diff --git a/src/viam/components/board/board.py b/src/viam/components/board/board.py index 1d8933aa0..9d0cb23b5 100644 --- a/src/viam/components/board/board.py +++ b/src/viam/components/board/board.py @@ -366,7 +366,7 @@ async def gpio_pin_by_name(self, name: str) -> GPIOPin: @abc.abstractmethod async def set_power_mode( - self, mode: PowerMode.ValueType, duration: Optional[timedelta] = None, *, timeout: Optional[float] = None, **kwargs + self, mode: PowerMode.ValueType, duration: Optional[timedelta] = None, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs ): """ Set the board to the indicated power mode. diff --git a/src/viam/components/board/client.py b/src/viam/components/board/client.py index 5377225da..4720667cc 100644 --- a/src/viam/components/board/client.py +++ b/src/viam/components/board/client.py @@ -201,6 +201,7 @@ async def set_power_mode( mode: PowerMode.ValueType, duration: Optional[timedelta] = None, *, + extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs, ): @@ -208,7 +209,7 @@ async def set_power_mode( duration_pb: Optional[Duration] = None if duration is not None: duration_pb = [(d, d.FromTimedelta(duration)) for d in [Duration()]][0][0] - request = SetPowerModeRequest(name=self.name, power_mode=mode, duration=duration_pb) + request = SetPowerModeRequest(name=self.name, power_mode=mode, duration=duration_pb, extra=dict_to_struct(extra)) await self.client.SetPowerMode(request, timeout=timeout, metadata=md) async def get_geometries(self, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs) -> List[Geometry]: diff --git a/src/viam/components/board/service.py b/src/viam/components/board/service.py index dbc837d80..4a985bf9d 100644 --- a/src/viam/components/board/service.py +++ b/src/viam/components/board/service.py @@ -164,6 +164,7 @@ async def SetPowerMode(self, stream: Stream[SetPowerModeRequest, SetPowerModeRes await board.set_power_mode( mode=request.power_mode, duration=request.duration.ToTimedelta(), + extra=struct_to_dict(request.extra), timeout=timeout, metadata=stream.metadata, ) diff --git a/tests/mocks/components.py b/tests/mocks/components.py index 6a06d661b..2faaebd52 100644 --- a/tests/mocks/components.py +++ b/tests/mocks/components.py @@ -436,8 +436,9 @@ async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Option return {"command": command} async def set_power_mode( - self, mode: PowerMode.ValueType, duration: Optional[timedelta] = None, *, timeout: Optional[float] = None, **kwargs + self, mode: PowerMode.ValueType, duration: Optional[timedelta] = None, *, extra: Optional[Dict[str, Any]] = None, timeout: Optional[float] = None, **kwargs ): + self.extra = extra self.timeout = timeout self.power_mode = mode self.power_mode_duration = duration diff --git a/tests/test_board.py b/tests/test_board.py index 185ca2502..7f8a9046b 100644 --- a/tests/test_board.py +++ b/tests/test_board.py @@ -275,12 +275,14 @@ async def test_set_power_mode(self, board: MockBoard, service: BoardRPCService): pm_mode = PowerMode.POWER_MODE_OFFLINE_DEEP pm_duration = Duration() pm_duration.FromTimedelta(timedelta(minutes=1)) - request = SetPowerModeRequest(name=board.name, power_mode=pm_mode, duration=pm_duration) + extra = {"foo": "bar", "baz": [1, 2, 3]} + request = SetPowerModeRequest(name=board.name, power_mode=pm_mode, duration=pm_duration, extra=dict_to_struct(extra)) response: SetPowerModeResponse = await client.SetPowerMode(request, timeout=6.66) assert response == SetPowerModeResponse() assert board.timeout == loose_approx(6.66) assert board.power_mode == PowerMode.POWER_MODE_OFFLINE_DEEP assert board.power_mode_duration == pm_duration.ToTimedelta() + assert board.extra == extra async def test_write_analog(self, board: MockBoard, service: BoardRPCService): async with ChannelFor([service]) as channel: