Skip to content

Commit 9cef739

Browse files
authored
Update to firmware 2.2.8 (#4)
* Implement new API methods * A few more * Fix mouse jiggler models * Add methods to enable and disable HDMI * Rename `mouse_jiggler_state` to `get_mouse_jiggler_state`
1 parent c2b2935 commit 9cef739

2 files changed

Lines changed: 79 additions & 8 deletions

File tree

nanokvm/client.py

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,17 @@
2626
GetCdRomRsp,
2727
GetGpioRsp,
2828
GetHardwareRsp,
29+
GetHdmiStateRsp,
2930
GetHidModeRsp,
3031
GetInfoRsp,
3132
GetMdnsStateRsp,
3233
GetMemoryLimitRsp,
3334
GetMountedImageRsp,
35+
GetMouseJigglerRsp,
3436
GetOLEDRsp,
3537
GetPreviewRsp,
3638
GetSSHStateRsp,
37-
GetSwapStateRsp,
39+
GetSwapSizeRsp,
3840
GetTailscaleStatusRsp,
3941
GetVersionRsp,
4042
GetVirtualDeviceRsp,
@@ -46,12 +48,15 @@
4648
LoginReq,
4749
LoginRsp,
4850
MountImageReq,
51+
MouseJigglerMode,
4952
PasteReq,
5053
SetGpioReq,
5154
SetHidModeReq,
5255
SetMemoryLimitReq,
56+
SetMouseJigglerReq,
5357
SetOledReq,
5458
SetPreviewReq,
59+
SetSwapSizeReq,
5560
StatusImageRsp,
5661
UpdateVirtualDeviceReq,
5762
UpdateVirtualDeviceRsp,
@@ -305,12 +310,19 @@ async def get_ssh_state(self) -> GetSSHStateRsp:
305310
response_model=GetSSHStateRsp,
306311
)
307312

308-
async def get_swap_state(self) -> GetSwapStateRsp:
309-
"""Get Swap enabled state."""
310-
return await self._api_request_json(
313+
async def get_swap_size(self) -> int:
314+
"""Get Swap size."""
315+
rsp = await self._api_request_json(
311316
hdrs.METH_GET,
312317
"/vm/swap",
313-
response_model=GetSwapStateRsp,
318+
response_model=GetSwapSizeRsp,
319+
)
320+
return rsp.size
321+
322+
async def set_swap_size(self, size_mb: int) -> None:
323+
"""Set the Swap size."""
324+
await self._api_request_json(
325+
hdrs.METH_POST, "/vm/swap", data=SetSwapSizeReq(size=size_mb)
314326
)
315327

316328
async def get_mdns_state(self) -> GetMdnsStateRsp:
@@ -561,10 +573,26 @@ async def reboot_system(self) -> None:
561573
"""Reboot the KVM device."""
562574
await self._api_request_json(hdrs.METH_POST, "/vm/system/reboot")
563575

576+
async def get_hdmi_state(self) -> GetHdmiStateRsp:
577+
"""Get the HDMI state."""
578+
return await self._api_request_json(
579+
hdrs.METH_GET,
580+
"/vm/hdmi",
581+
response_model=GetHdmiStateRsp,
582+
)
583+
564584
async def reset_hdmi(self) -> None:
565-
"""Reset the HDMI connection (relevant for PCIe version)."""
585+
"""Reset the HDMI connection."""
566586
await self._api_request_json(hdrs.METH_POST, "/vm/hdmi/reset")
567587

588+
async def enable_hdmi(self) -> None:
589+
"""Enable the HDMI connection."""
590+
await self._api_request_json(hdrs.METH_POST, "/vm/hdmi/enable")
591+
592+
async def disable_hdmi(self) -> None:
593+
"""Disable the HDMI connection."""
594+
await self._api_request_json(hdrs.METH_POST, "/vm/hdmi/disable")
595+
568596
async def reset_hid(self) -> None:
569597
"""Reset the HID subsystem."""
570598
await self._api_request_json(hdrs.METH_POST, "/hid/reset")
@@ -608,3 +636,21 @@ async def tailscale_stop(self) -> None:
608636
async def tailscale_restart(self) -> None:
609637
"""Perform a Tailscale action: restart."""
610638
await self._api_request_json(hdrs.METH_POST, "/extensions/tailscale/restart")
639+
640+
async def get_mouse_jiggler_state(self) -> GetMouseJigglerRsp:
641+
"""Get the mouse jiggler state."""
642+
return await self._api_request_json(
643+
hdrs.METH_GET,
644+
"/vm/mouse-jiggler",
645+
response_model=GetMouseJigglerRsp,
646+
)
647+
648+
async def set_mouse_jiggler_state(
649+
self, enabled: bool, mode: MouseJigglerMode
650+
) -> None:
651+
"""Set the mouse jiggler state."""
652+
await self._api_request_json(
653+
hdrs.METH_POST,
654+
"/vm/mouse-jiggler",
655+
data=SetMouseJigglerReq(enabled=enabled, mode=mode),
656+
)

nanokvm/models.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,13 @@ class HWVersion(StrEnum):
9494
UNKNOWN = "Unknown"
9595

9696

97+
class MouseJigglerMode(StrEnum):
98+
"""Mouse Jiggler Modes."""
99+
100+
ABSOLUTE = "absolute"
101+
RELATIVE = "relative"
102+
103+
97104
# Generic Response Wrapper
98105
class ApiResponse(BaseModel, Generic[T]):
99106
"""Generic API response structure."""
@@ -199,8 +206,12 @@ class GetSSHStateRsp(BaseModel):
199206
enabled: bool
200207

201208

202-
class GetSwapStateRsp(BaseModel):
203-
enabled: bool | None = None
209+
class GetSwapSizeRsp(BaseModel):
210+
size: int
211+
212+
213+
class SetSwapSizeReq(BaseModel):
214+
size: int
204215

205216

206217
class GetMdnsStateRsp(BaseModel):
@@ -296,3 +307,17 @@ class StatusImageRsp(BaseModel):
296307
class DownloadImageReq(BaseModel):
297308
file: str # URL of the image to download
298309
# cdrom field is ignored for downloads
310+
311+
312+
class SetMouseJigglerReq(BaseModel):
313+
enabled: bool
314+
mode: MouseJigglerMode
315+
316+
317+
class GetMouseJigglerRsp(BaseModel):
318+
enabled: bool
319+
mode: MouseJigglerMode
320+
321+
322+
class GetHdmiStateRsp(BaseModel):
323+
enabled: bool

0 commit comments

Comments
 (0)