forked from platformio/platformio-core
Add support for custom device monitor filters located in package folders // Issue #3924
This commit is contained in:
2
docs
2
docs
Submodule docs updated: 5ed82cb1b2...fe44638e2d
@ -23,7 +23,6 @@ from serial.tools import miniterm
|
|||||||
from platformio import exception, fs, util
|
from platformio import exception, fs, util
|
||||||
from platformio.commands.device import helpers as device_helpers
|
from platformio.commands.device import helpers as device_helpers
|
||||||
from platformio.platform.factory import PlatformFactory
|
from platformio.platform.factory import PlatformFactory
|
||||||
from platformio.project.config import ProjectConfig
|
|
||||||
from platformio.project.exception import NotPlatformIOProjectError
|
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",
|
help="Load configuration from `platformio.ini` and specified environment",
|
||||||
)
|
)
|
||||||
def device_monitor(**kwargs): # pylint: disable=too-many-branches
|
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 = {}
|
project_options = {}
|
||||||
platform = None
|
platform = None
|
||||||
try:
|
try:
|
||||||
with fs.cd(kwargs["project_dir"]):
|
with fs.cd(kwargs["project_dir"]):
|
||||||
project_options = device_helpers.get_project_options(kwargs["environment"])
|
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 = device_helpers.apply_project_monitor_options(
|
||||||
kwargs, project_options
|
kwargs, project_options
|
||||||
)
|
)
|
||||||
|
if "platform" in project_options:
|
||||||
|
platform = PlatformFactory.new(project_options["platform"])
|
||||||
except NotPlatformIOProjectError:
|
except NotPlatformIOProjectError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
with fs.cd(kwargs["project_dir"]):
|
||||||
|
device_helpers.register_filters(platform=platform, options=kwargs)
|
||||||
|
|
||||||
if not kwargs["port"]:
|
if not kwargs["port"]:
|
||||||
ports = util.get_serial_ports(filter_hwid=True)
|
ports = util.get_serial_ports(filter_hwid=True)
|
||||||
if len(ports) == 1:
|
if len(ports) == 1:
|
||||||
|
@ -20,6 +20,7 @@ from serial.tools import miniterm
|
|||||||
from platformio import fs
|
from platformio import fs
|
||||||
from platformio.commands.device import DeviceMonitorFilter
|
from platformio.commands.device import DeviceMonitorFilter
|
||||||
from platformio.compat import get_object_members, load_python_module
|
from platformio.compat import get_object_members, load_python_module
|
||||||
|
from platformio.package.manager.tool import ToolPackageManager
|
||||||
from platformio.project.config import ProjectConfig
|
from platformio.project.config import ProjectConfig
|
||||||
|
|
||||||
|
|
||||||
@ -92,13 +93,40 @@ def load_monitor_filter(path, options=None):
|
|||||||
return True
|
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):
|
if not os.path.isdir(monitor_dir):
|
||||||
return
|
return
|
||||||
for name in os.listdir(monitor_dir):
|
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
|
continue
|
||||||
path = os.path.join(monitor_dir, name)
|
path = os.path.join(monitor_dir, name)
|
||||||
if not os.path.isfile(path):
|
if not os.path.isfile(path):
|
||||||
continue
|
continue
|
||||||
load_monitor_filter(path, options)
|
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,
|
||||||
|
)
|
||||||
|
Reference in New Issue
Block a user