forked from platformio/platformio-core
103 lines
3.4 KiB
Python
103 lines
3.4 KiB
Python
# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import inspect
|
|
import os
|
|
|
|
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.project.config import ProjectConfig
|
|
|
|
|
|
def apply_project_monitor_options(cli_options, project_options):
|
|
for k in ("port", "speed", "rts", "dtr"):
|
|
k2 = "monitor_%s" % k
|
|
if k == "speed":
|
|
k = "baud"
|
|
if cli_options[k] is None and k2 in project_options:
|
|
cli_options[k] = project_options[k2]
|
|
if k != "port":
|
|
cli_options[k] = int(cli_options[k])
|
|
return cli_options
|
|
|
|
|
|
def options_to_argv(cli_options, project_options, ignore=None):
|
|
confmon_flags = project_options.get("monitor_flags", [])
|
|
result = confmon_flags[::]
|
|
|
|
for f in project_options.get("monitor_filters", []):
|
|
result.extend(["--filter", f])
|
|
|
|
for k, v in cli_options.items():
|
|
if v is None or (ignore and k in ignore):
|
|
continue
|
|
k = "--" + k.replace("_", "-")
|
|
if k in confmon_flags:
|
|
continue
|
|
if isinstance(v, bool):
|
|
if v:
|
|
result.append(k)
|
|
elif isinstance(v, tuple):
|
|
for i in v:
|
|
result.extend([k, i])
|
|
else:
|
|
result.extend([k, str(v)])
|
|
return result
|
|
|
|
|
|
def get_project_options(environment=None):
|
|
config = ProjectConfig.get_instance()
|
|
config.validate(envs=[environment] if environment else None)
|
|
if not environment:
|
|
default_envs = config.default_envs()
|
|
if default_envs:
|
|
environment = default_envs[0]
|
|
else:
|
|
environment = config.envs()[0]
|
|
return config.items(env=environment, as_dict=True)
|
|
|
|
|
|
def get_board_hwids(project_dir, platform, board):
|
|
with fs.cd(project_dir):
|
|
return platform.board_config(board).get("build.hwids", [])
|
|
|
|
|
|
def register_platform_filters(platform, project_dir, environment):
|
|
monitor_dir = os.path.join(platform.get_dir(), "monitor")
|
|
if not os.path.isdir(monitor_dir):
|
|
return
|
|
|
|
for fn in os.listdir(monitor_dir):
|
|
if not fn.startswith("filter_") or not fn.endswith(".py"):
|
|
continue
|
|
path = os.path.join(monitor_dir, fn)
|
|
if not os.path.isfile(path):
|
|
continue
|
|
|
|
module = load_python_module(
|
|
"platformio.commands.device.filters.%s" % fn[: fn.find(".")], path
|
|
)
|
|
for cls in get_object_members(module).values():
|
|
if (
|
|
not inspect.isclass(cls)
|
|
or not issubclass(cls, DeviceMonitorFilter)
|
|
or cls == DeviceMonitorFilter
|
|
):
|
|
continue
|
|
obj = cls(project_dir, environment)
|
|
miniterm.TRANSFORMATIONS[obj.NAME] = obj
|