From 1d16b63bc79783876b49e2feafaec9f9fb703f6a Mon Sep 17 00:00:00 2001
From: Jordan Yates
Date: Wed, 14 Jan 2026 10:01:49 +1000
Subject: [PATCH 1/7] generated: rpc_definitions: regenerate
Regenerate for new RPC.
Signed-off-by: Jordan Yates
---
src/infuse_iot/generated/rpc_definitions.py | 40 +++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/src/infuse_iot/generated/rpc_definitions.py b/src/infuse_iot/generated/rpc_definitions.py
index 2e97d42..63ea244 100644
--- a/src/infuse_iot/generated/rpc_definitions.py
+++ b/src/infuse_iot/generated/rpc_definitions.py
@@ -211,6 +211,17 @@ class rpc_struct_heap_info(VLACompatLittleEndianStruct):
_pack_ = 1
+class rpc_struct_data_logger_chunk(VLACompatLittleEndianStruct):
+ """Data logger chunk description"""
+
+ _fields_ = [
+ ("start_block", ctypes.c_uint32),
+ ("start_offset", ctypes.c_uint16),
+ ("num_bytes", ctypes.c_uint32),
+ ]
+ _pack_ = 1
+
+
class rpc_enum_bt_le_addr_type(enum.IntEnum):
"""Bluetooth LE address type"""
@@ -820,6 +831,32 @@ class response(VLACompatLittleEndianStruct):
_pack_ = 1
+class data_logger_read_chunks(RPCDefinitionBase):
+ """Read a number of arbitrary chunks from a data logger"""
+
+ NAME = "data_logger_read_chunks"
+ HELP = "Read a number of arbitrary chunks from a data logger"
+ DESCRIPTION = "Read a number of arbitrary chunks from a data logger"
+ COMMAND_ID = 25
+
+ class request(VLACompatLittleEndianStruct):
+ _fields_ = [
+ ("logger", ctypes.c_uint8),
+ ("num_chunks", ctypes.c_uint8),
+ ]
+ vla_field = ("chunks", 0 * rpc_struct_data_logger_chunk)
+ _pack_ = 1
+
+ class response(VLACompatLittleEndianStruct):
+ _fields_ = [
+ ("sent_len", ctypes.c_uint32),
+ ("sent_crc", ctypes.c_uint32),
+ ("current_block", ctypes.c_uint32),
+ ("block_size", ctypes.c_uint16),
+ ]
+ _pack_ = 1
+
+
class coap_download(RPCDefinitionBase):
"""Download a file from a COAP server (Infuse-IoT DTLS protected)"""
@@ -1257,6 +1294,7 @@ class response(VLACompatLittleEndianStruct):
data_logger_read_available.COMMAND_ID: data_logger_read_available,
lte_state_v2.COMMAND_ID: lte_state_v2,
data_logger_state_v2.COMMAND_ID: data_logger_state_v2,
+ data_logger_read_chunks.COMMAND_ID: data_logger_read_chunks,
coap_download.COMMAND_ID: coap_download,
zperf_upload.COMMAND_ID: zperf_upload,
coap_download_v2.COMMAND_ID: coap_download_v2,
@@ -1293,6 +1331,7 @@ class response(VLACompatLittleEndianStruct):
"rpc_struct_infuse_state",
"rpc_struct_sockaddr",
"rpc_struct_heap_info",
+ "rpc_struct_data_logger_chunk",
"rpc_enum_bt_le_addr_type",
"rpc_enum_file_action",
"rpc_enum_infuse_bt_characteristic",
@@ -1325,6 +1364,7 @@ class response(VLACompatLittleEndianStruct):
"data_logger_read_available",
"lte_state_v2",
"data_logger_state_v2",
+ "data_logger_read_chunks",
"coap_download",
"zperf_upload",
"coap_download_v2",
From 9aa89db45243d5947a541f578737bb3e677aaee5 Mon Sep 17 00:00:00 2001
From: Jordan Yates
Date: Wed, 14 Jan 2026 10:02:08 +1000
Subject: [PATCH 2/7] rpc_wrappers: zperf_upload: reduce default payload size
Reduce the default payload size by 4 bytes to make it work out of the
box on devices only supporting the minimum IPv4 MTU (576).
Signed-off-by: Jordan Yates
---
src/infuse_iot/rpc_wrappers/zperf_upload.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/infuse_iot/rpc_wrappers/zperf_upload.py b/src/infuse_iot/rpc_wrappers/zperf_upload.py
index af74eb6..6bcd8b3 100644
--- a/src/infuse_iot/rpc_wrappers/zperf_upload.py
+++ b/src/infuse_iot/rpc_wrappers/zperf_upload.py
@@ -65,7 +65,7 @@ def add_parser(cls, parser):
parser.add_argument("--encrypt", action="store_true", help="Encrypt payloads before transmission")
parser.add_argument("--duration", type=int, default=5000, help="Duration to run test over in milliseconds")
parser.add_argument("--rate-kbps", type=int, default=0, help="Desired upload rate in kbps")
- parser.add_argument("--payload-size", type=int, default=512, help="Payload size")
+ parser.add_argument("--payload-size", type=int, default=508, help="Payload size")
def __init__(self, args):
self.peer_addr = ipaddress.ip_address(args.address)
From 371d25bac8d3d47028410b6e38f93b278ed9a171 Mon Sep 17 00:00:00 2001
From: Jordan Yates
Date: Wed, 14 Jan 2026 10:03:26 +1000
Subject: [PATCH 3/7] rpc_wrappers: ubx_assist_now_ztp_creds: added
Add wrapper for the new RPC.
Signed-off-by: Jordan Yates
---
.../rpc_wrappers/ubx_assist_now_ztp_creds.py | 29 +++++++++++++++++++
1 file changed, 29 insertions(+)
create mode 100644 src/infuse_iot/rpc_wrappers/ubx_assist_now_ztp_creds.py
diff --git a/src/infuse_iot/rpc_wrappers/ubx_assist_now_ztp_creds.py b/src/infuse_iot/rpc_wrappers/ubx_assist_now_ztp_creds.py
new file mode 100644
index 0000000..2661de2
--- /dev/null
+++ b/src/infuse_iot/rpc_wrappers/ubx_assist_now_ztp_creds.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+
+
+import infuse_iot.definitions.rpc as defs
+from infuse_iot.commands import InfuseRpcCommand
+from infuse_iot.zephyr.errno import errno
+
+
+class ubx_assist_now_ztp_creds(InfuseRpcCommand, defs.ubx_assist_now_ztp_creds):
+ @classmethod
+ def add_parser(cls, parser):
+ parser.add_argument("--offset", "-o", type=int, default=0, help="Offset for UBX-MON-VER frame")
+
+ def __init__(self, args):
+ self._offset = args.offset
+
+ def request_struct(self):
+ return self.request(self._offset)
+
+ def request_json(self):
+ return {"mon_ver_offset": str(self._offset)}
+
+ def handle_response(self, return_code, response):
+ if return_code != 0:
+ print(f"Failed to query ZTP credentials ({errno.strerror(-return_code)})")
+ return
+
+ print(f"UBX-SEC-UNIQID: {bytes(response.ubx_sec_uniqid).hex()}")
+ print(f" UBX-MON-VER: {bytes(response.ubx_mon_ver).hex()}")
From c68ab4aa100b56592b60f5d2a6f4129764ba60d4 Mon Sep 17 00:00:00 2001
From: Jordan Yates
Date: Tue, 13 Jan 2026 12:03:23 +1000
Subject: [PATCH 4/7] tools: localhost: sort TDF list
Make the list of displayed TDFs sorted by name.
Signed-off-by: Jordan Yates
---
src/infuse_iot/tools/localhost.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/infuse_iot/tools/localhost.py b/src/infuse_iot/tools/localhost.py
index 6a831f1..53b4533 100644
--- a/src/infuse_iot/tools/localhost.py
+++ b/src/infuse_iot/tools/localhost.py
@@ -123,7 +123,7 @@ async def websocket_handler(self, request: BaseRequest):
message = {
"columns": columns,
"rows": [self._data[d] for d in devices],
- "tdfs": list(self._columns.keys()),
+ "tdfs": sorted(list(self._columns.keys())),
}
self._data_lock.release()
From 46ec92004a73ffdb1454526b0e217f0e129e2342 Mon Sep 17 00:00:00 2001
From: Jordan Yates
Date: Tue, 13 Jan 2026 12:06:51 +1000
Subject: [PATCH 5/7] tools: localhost: move update pause button
Move the update pause button into the secondary title so that it can't
be pushed off the screen by the size of the TDF and app tables.
Signed-off-by: Jordan Yates
---
src/infuse_iot/tools/localhost/index.html | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/infuse_iot/tools/localhost/index.html b/src/infuse_iot/tools/localhost/index.html
index 9e8ddd5..1f1a2d8 100644
--- a/src/infuse_iot/tools/localhost/index.html
+++ b/src/infuse_iot/tools/localhost/index.html
@@ -30,12 +30,13 @@ Infuse-IoT TDF Viewer
-
Table Control
+ Table Control
+
+
+ )
+
-
-
-