From f391150d041f3dc7e4368583ae6ec6c5c1aff6f4 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Wed, 5 Jun 2024 18:32:17 -0400 Subject: [PATCH] Support `GET_BUILD_STRING_REQ` --- bellows/ezsp/__init__.py | 14 ++++++++++++++ bellows/ezsp/xncp.py | 15 +++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/bellows/ezsp/__init__.py b/bellows/ezsp/__init__.py index e995acf7..8b4546c0 100644 --- a/bellows/ezsp/__init__.py +++ b/bellows/ezsp/__init__.py @@ -381,6 +381,15 @@ async def get_board_info( special, ver_info_bytes = t.uint8_t.deserialize(ver_info_bytes) version = f"{major}.{minor}.{patch}.{special} build {build}" + if xncp.FirmwareFeatures.BUILD_STRING in self._xncp_features: + try: + build_string = await self.xncp_get_build_string() + except InvalidCommandError: + build_string = None + + if build_string: + version = f"{version} ({build_string})" + return ( tokens[t.EzspMfgTokenId.MFG_STRING], tokens[t.EzspMfgTokenId.MFG_BOARD_NAME], @@ -702,3 +711,8 @@ async def xncp_get_mfg_token_override(self, token: t.EzspMfgTokenId) -> bytes: """Get manufacturing token override.""" rsp = await self.send_xncp_frame(xncp.GetMfgTokenOverrideReq(token=token)) return rsp.value + + async def xncp_get_build_string(self) -> bytes: + """Get build string.""" + rsp = await self.send_xncp_frame(xncp.GetBuildStringReq()) + return rsp.build_string.decode("utf-8") diff --git a/bellows/ezsp/xncp.py b/bellows/ezsp/xncp.py index 02805a06..af7c03ec 100644 --- a/bellows/ezsp/xncp.py +++ b/bellows/ezsp/xncp.py @@ -46,10 +46,12 @@ class XncpCommandId(t.enum16): GET_SUPPORTED_FEATURES_REQ = 0x0000 SET_SOURCE_ROUTE_REQ = 0x0001 GET_MFG_TOKEN_OVERRIDE_REQ = 0x0002 + GET_BUILD_STRING_REQ = 0x0003 GET_SUPPORTED_FEATURES_RSP = GET_SUPPORTED_FEATURES_REQ | 0x8000 SET_SOURCE_ROUTE_RSP = SET_SOURCE_ROUTE_REQ | 0x8000 GET_MFG_TOKEN_OVERRIDE_RSP = GET_MFG_TOKEN_OVERRIDE_REQ | 0x8000 + GET_BUILD_STRING_RSP = GET_BUILD_STRING_REQ | 0x8000 UNKNOWN = 0xFFFF @@ -99,6 +101,9 @@ class FirmwareFeatures(t.bitmap32): # The firmware supports overriding some manufacturing tokens MFG_TOKEN_OVERRIDES = 1 << 2 + # The firmware contains a free-form build string + BUILD_STRING = 1 << 3 + class XncpCommandPayload(t.Struct): pass @@ -133,3 +138,13 @@ class GetMfgTokenOverrideReq(XncpCommandPayload): @register_command(XncpCommandId.GET_MFG_TOKEN_OVERRIDE_RSP) class GetMfgTokenOverrideRsp(XncpCommandPayload): value: Bytes + + +@register_command(XncpCommandId.GET_BUILD_STRING_REQ) +class GetBuildStringReq(XncpCommandPayload): + pass + + +@register_command(XncpCommandId.GET_BUILD_STRING_RSP) +class GetBuildStringRsp(XncpCommandPayload): + build_string: Bytes