From f8dafbca8063e893ddaa09855607c813a577d1ac Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 25 Jan 2018 17:58:52 +0200 Subject: [PATCH] Show device system information (MCU, Frequency, RAM, Flash, Debugging tools) in a build log --- HISTORY.rst | 4 +- docs | 2 +- platformio/builder/main.py | 3 +- platformio/builder/tools/pioplatform.py | 50 ++++++++++++++++++++++++- platformio/builder/tools/platformio.py | 2 + platformio/commands/boards.py | 16 ++------ platformio/managers/platform.py | 8 ++-- platformio/util.py | 17 +++++++++ 8 files changed, 82 insertions(+), 20 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 5fa9c650..384188b4 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,7 +7,9 @@ PlatformIO 3.0 3.5.2 (2018-??-??) ~~~~~~~~~~~~~~~~~~ -* Show all available upload protocols before firmware uploading +* Show device system information (MCU, Frequency, RAM, Flash, Debugging tools) + in a build log +* Show all available upload protocols before firmware uploading in a build log * Handle "os.mbed.com" URL as a Mercurial (hg) repository * Improved support for old mbed libraries without manifest * Fixed issue with duplicated "include" records when generating data for IDE diff --git a/docs b/docs index a65d0426..ec9ec10d 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit a65d04269399f6170e112b56aace6b368835254b +Subproject commit ec9ec10dcd7a335729503f4cedd3a2f0c06e5e6d diff --git a/platformio/builder/main.py b/platformio/builder/main.py index 8fc405f5..ef6be34a 100644 --- a/platformio/builder/main.py +++ b/platformio/builder/main.py @@ -184,7 +184,8 @@ if "idedata" in COMMAND_LINE_TARGETS: env.Exit(1) -def print_upload_protocols_info(source, target, env): +def print_upload_protocols_info( # pylint: disable=unused-argument + source, target, _): selected = env.subst("$UPLOAD_PROTOCOL") available = env.BoardConfig().get("upload", {}).get( "protocols", [selected]) diff --git a/platformio/builder/tools/pioplatform.py b/platformio/builder/tools/pioplatform.py index 02519dbe..80fb5e67 100644 --- a/platformio/builder/tools/pioplatform.py +++ b/platformio/builder/tools/pioplatform.py @@ -41,8 +41,9 @@ def PioPlatform(env): def BoardConfig(env, board=None): p = initPioPlatform(env['PLATFORM_MANIFEST']) try: - assert env.get("BOARD", board), "BoardConfig: Board is not defined" - config = p.board_config(board if board else env.get("BOARD")) + board = board or env.get("BOARD") + assert board, "BoardConfig: Board is not defined" + config = p.board_config(board) except (AssertionError, exception.UnknownBoard) as e: sys.stderr.write("Error: %s\n" % str(e)) env.Exit(1) @@ -97,6 +98,50 @@ def LoadPioPlatform(env, variables): env.Replace(LDSCRIPT_PATH=board_config.get("build.ldscript")) +def PrintSystemInfo(env): + data = [] + debug_tools = None + mcu = env.subst("$BOARD_MCU") + f_cpu = env.subst("$BOARD_F_CPU") + if mcu: + data.append(mcu.upper()) + if f_cpu: + f_cpu = int("".join([c for c in str(f_cpu) if c.isdigit()])) + data.append("%dMHz" % (f_cpu / 1000000)) + + if "BOARD" in env: + board_config = env.BoardConfig() + debug_tools = board_config.get("debug", {}).get("tools") + ram = board_config.get("upload", {}).get("maximum_ram_size") + flash = board_config.get("upload", {}).get("maximum_size") + for (key, value) in (("RAM", ram), ("Flash", flash)): + if not value: + continue + data.append("%s/%s" % (key, util.format_filesize(value))) + + if data: + print "System: %s" % " ".join(data) + + # Debugging + if not debug_tools: + return + + data = [] + onboard = [] + external = [] + for key, value in debug_tools.items(): + if value.get("onboard"): + onboard.append(key) + else: + external.append(key) + if onboard: + data.append("ON-BORD(%s)" % ", ".join(sorted(onboard))) + if external: + data.append("EXTERNAL(%s)" % ", ".join(sorted(external))) + + print "Debug: %s" % " ".join(data) + + def exists(_): return True @@ -106,4 +151,5 @@ def generate(env): env.AddMethod(BoardConfig) env.AddMethod(GetFrameworkScript) env.AddMethod(LoadPioPlatform) + env.AddMethod(PrintSystemInfo) return env diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index 0ca092de..a02a6fe9 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -42,6 +42,8 @@ def BuildProgram(env): _append_pio_macros() + env.PrintSystemInfo() + # fix ASM handling under non-casitive OS if not case_sensitive_suffixes(".s", ".S"): env.Replace(AS="$CC", ASCOM="$ASPPCOM") diff --git a/platformio/commands/boards.py b/platformio/commands/boards.py index e4921354..5764b9f8 100644 --- a/platformio/commands/boards.py +++ b/platformio/commands/boards.py @@ -16,6 +16,7 @@ import json import click +from platformio import util from platformio.managers.platform import PlatformManager @@ -60,22 +61,13 @@ def print_boards(boards): click.echo("-" * terminal_width) for board in boards: - ram_size = board['ram'] - if ram_size >= 1024: - if ram_size % 1024: - ram_size = "%.1fkB" % (ram_size / 1024.0) - else: - ram_size = "%dkB" % (ram_size / 1024) - else: - ram_size = "%dB" % ram_size - click.echo( BOARDLIST_TPL.format( type=click.style(board['id'], fg="cyan"), mcu=board['mcu'], - frequency="%dMhz" % (board['fcpu'] / 1000000), - flash="%dkB" % (board['rom'] / 1024), - ram=ram_size, + frequency="%dMHz" % (board['fcpu'] / 1000000), + flash=util.format_filesize(board['rom']), + ram=util.format_filesize(board['ram']), name=board['name'])) diff --git a/platformio/managers/platform.py b/platformio/managers/platform.py index b3090705..1485059f 100644 --- a/platformio/managers/platform.py +++ b/platformio/managers/platform.py @@ -684,9 +684,11 @@ class PlatformBoardConfig(object): "mcu": self._manifest.get("build", {}).get("mcu", "").upper(), "fcpu": - int( - re.sub(r"[^\d]+", "", - self._manifest.get("build", {}).get("f_cpu", "0L"))), + int("".join([ + c for c in str( + self._manifest.get("build", {}).get("f_cpu", "0L")) + if c.isdigit() + ])), "ram": self._manifest.get("upload", {}).get("maximum_ram_size", 0), "rom": diff --git a/platformio/util.py b/platformio/util.py index 61f26169..526d69e7 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -743,6 +743,23 @@ def parse_date(datestr): return time.strptime(datestr) +def format_filesize(filesize): + base = 1024 + unit = 0 + suffix = "B" + filesize = float(filesize) + if filesize < base: + return "%d%s" % (filesize, suffix) + for i, suffix in enumerate("KMGTPEZY"): + unit = base**(i + 2) + if filesize >= unit: + continue + if filesize % (base**(i + 1)): + return "%.2f%s" % ((base * filesize / unit), suffix) + break + return "%d%s" % ((base * filesize / unit), suffix) + + def rmtree_(path): def _onerror(_, name, __):