From 411764854b16ea4b286ad8fae6b7e7c87f9e8bed Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 5 Nov 2021 16:28:49 +0200 Subject: [PATCH] Add support for custom device monitor filters located in package folders // Issue #3924 --- docs | 2 +- platformio/commands/device/command.py | 24 +++++--------------- platformio/commands/device/helpers.py | 32 +++++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/docs b/docs index 5ed82cb1..fe44638e 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 5ed82cb1b21c4bca98bc19033f256172f6466244 +Subproject commit fe44638e2d482424bebd9f66e4eddb2c03180f22 diff --git a/platformio/commands/device/command.py b/platformio/commands/device/command.py index c3941cb8..fb7877e4 100644 --- a/platformio/commands/device/command.py +++ b/platformio/commands/device/command.py @@ -23,7 +23,6 @@ from serial.tools import miniterm from platformio import exception, fs, util from platformio.commands.device import helpers as device_helpers from platformio.platform.factory import PlatformFactory -from platformio.project.config import ProjectConfig from platformio.project.exception import NotPlatformIOProjectError @@ -173,35 +172,22 @@ def device_list( # pylint: disable=too-many-branches help="Load configuration from `platformio.ini` and specified environment", ) def device_monitor(**kwargs): # pylint: disable=too-many-branches - # load default monitor filters - filters_dir = os.path.join(fs.get_source_dir(), "commands", "device", "filters") - for name in os.listdir(filters_dir): - if not name.endswith(".py"): - continue - device_helpers.load_monitor_filter( - os.path.join(filters_dir, name), options=kwargs - ) - project_options = {} platform = None try: with fs.cd(kwargs["project_dir"]): project_options = device_helpers.get_project_options(kwargs["environment"]) - device_helpers.register_filters( - ProjectConfig.get_instance().get("platformio", "monitor_dir"), - options=kwargs, - ) - if "platform" in project_options: - platform = PlatformFactory.new(project_options["platform"]) - device_helpers.register_filters( - os.path.join(platform.get_dir(), "monitor"), options=kwargs - ) kwargs = device_helpers.apply_project_monitor_options( kwargs, project_options ) + if "platform" in project_options: + platform = PlatformFactory.new(project_options["platform"]) except NotPlatformIOProjectError: pass + with fs.cd(kwargs["project_dir"]): + device_helpers.register_filters(platform=platform, options=kwargs) + if not kwargs["port"]: ports = util.get_serial_ports(filter_hwid=True) if len(ports) == 1: diff --git a/platformio/commands/device/helpers.py b/platformio/commands/device/helpers.py index 8b4b789c..558d6a2e 100644 --- a/platformio/commands/device/helpers.py +++ b/platformio/commands/device/helpers.py @@ -20,6 +20,7 @@ from serial.tools import miniterm from platformio import fs from platformio.commands.device import DeviceMonitorFilter from platformio.compat import get_object_members, load_python_module +from platformio.package.manager.tool import ToolPackageManager from platformio.project.config import ProjectConfig @@ -92,13 +93,40 @@ def load_monitor_filter(path, options=None): return True -def register_filters(monitor_dir, options=None): +def load_monitor_filters(monitor_dir, prefix=None, options=None): if not os.path.isdir(monitor_dir): return for name in os.listdir(monitor_dir): - if not name.startswith("filter_") or not name.endswith(".py"): + if (prefix and not name.startswith(prefix)) or not name.endswith(".py"): continue path = os.path.join(monitor_dir, name) if not os.path.isfile(path): continue load_monitor_filter(path, options) + + +def register_filters(platform=None, options=None): + # project filters + load_monitor_filters( + ProjectConfig.get_instance().get("platformio", "monitor_dir"), + prefix="filter_", + options=options, + ) + # platform filters + if platform: + load_monitor_filters( + os.path.join(platform.get_dir(), "monitor"), + prefix="filter_", + options=options, + ) + # load package filters + pm = ToolPackageManager() + for pkg in pm.get_installed(): + load_monitor_filters( + os.path.join(pkg.path, "monitor"), prefix="filter_", options=options + ) + # default filters + load_monitor_filters( + os.path.join(fs.get_source_dir(), "commands", "device", "filters"), + options=options, + )