diff --git a/gp2040ce_bintools/builder.py b/gp2040ce_bintools/builder.py index bee2a2e..2d96d1f 100644 --- a/gp2040ce_bintools/builder.py +++ b/gp2040ce_bintools/builder.py @@ -10,6 +10,7 @@ import os import re from typing import Optional +from google.protobuf.json_format import MessageToJson from google.protobuf.message import Message import gp2040ce_bintools.storage as storage @@ -248,15 +249,19 @@ def write_new_config_to_filename(config: Message, filename: str, inject: bool = with open(filename, 'wb') as file: file.write(binary) else: - binary = storage.serialize_config_with_footer(config) - with open(filename, 'wb') as file: - if filename[-4:] == '.uf2': - # we must pad to storage start in order for the UF2 write addresses to make sense - file.write(storage.convert_binary_to_uf2([ - (storage.USER_CONFIG_BINARY_LOCATION, storage.pad_config_to_storage_size(binary)), - ])) - else: - file.write(binary) + if filename[-5:] == '.json': + with open(filename, 'w') as file: + file.write(MessageToJson(config)) + else: + binary = storage.serialize_config_with_footer(config) + with open(filename, 'wb') as file: + if filename[-4:] == '.uf2': + # we must pad to storage start in order for the UF2 write addresses to make sense + file.write(storage.convert_binary_to_uf2([ + (storage.USER_CONFIG_BINARY_LOCATION, storage.pad_config_to_storage_size(binary)), + ])) + else: + file.write(binary) def write_new_config_to_usb(config: Message, endpoint_out: object, endpoint_in: object): diff --git a/tests/test_builder.py b/tests/test_builder.py index 1857be3..e2812d1 100644 --- a/tests/test_builder.py +++ b/tests/test_builder.py @@ -3,6 +3,7 @@ SPDX-FileCopyrightText: © 2023 Brian S. Stephan SPDX-License-Identifier: GPL-3.0-or-later """ +import logging import math import os import sys @@ -14,10 +15,12 @@ from decorator import decorator import gp2040ce_bintools.builder as builder from gp2040ce_bintools import get_config_pb2 from gp2040ce_bintools.storage import (STORAGE_SIZE, get_board_storage_section, get_config, get_config_footer, - get_user_storage_section, serialize_config_with_footer) + get_config_from_json, get_user_storage_section, serialize_config_with_footer) HERE = os.path.dirname(os.path.abspath(__file__)) +logger = logging.getLogger(__name__) + @decorator def with_pb2s(test, *args, **kwargs): @@ -351,6 +354,21 @@ def test_write_new_config_to_config_uf2(firmware_binary, tmp_path): assert len(config_dump) == STORAGE_SIZE * 2 +@with_pb2s +def test_write_new_config_to_config_json(config_binary, tmp_path): + """Test that the config can be written to a file.""" + tmp_file = os.path.join(tmp_path, 'config.json') + config = get_config(config_binary) + builder.write_new_config_to_filename(config, tmp_file) + + # read new file + with open(tmp_file, 'r') as file: + config_dump = file.read() + logger.debug(config_dump) + config = get_config_from_json(config_dump) + assert config.boardVersion == 'v0.7.5' + + @with_pb2s def test_write_new_config_to_usb(config_binary): """Test that the config can be written to USB at the proper alignment."""