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", 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()}") 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) 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() diff --git a/src/infuse_iot/tools/localhost/index.html b/src/infuse_iot/tools/localhost/index.html index 9e8ddd5..b2822cb 100644 --- a/src/infuse_iot/tools/localhost/index.html +++ b/src/infuse_iot/tools/localhost/index.html @@ -15,6 +15,17 @@ font-family: monospace; } + .sidebar { + height: 100%; /* 100% Full-height */ + width: 0; /* 0 width - change this with JavaScript */ + position: fixed; /* Stay in place */ + z-index: 1; /* Stay on top */ + top: 0; + right: 0; + background-color: #ffffff; /* White */ + overflow-x: hidden; /* Disable horizontal scroll */ + } + #tdf-show { vertical-align: top; } @@ -22,31 +33,54 @@ #app-show { vertical-align: top; } + + #data-table { + width: 100%; + };

Infuse-IoT TDF Viewer

-

+ +

+
+ + Filtering: + + + + + + + +
-

-

-

Table Control

- - -
- - -