ardupilot/Tools/ardupilotwaf/vscode_helper.py
2025-01-22 18:23:57 +11:00

106 lines
3.7 KiB
Python

import os
import json
import shutil
H7_DUAL_BANK_LIST = [
"STM32H7A3xx",
"STM32H7A3xxq",
"STM32H7B3xx",
"STM32H7B3xxq",
"STM32H742xx",
"STM32H743xx",
"STM32H745xg",
"STM32H745xx",
"STM32H747xg",
"STM32H747xx",
"STM32H753xx",
"STM32H755xx",
"STM32H755xx",
"STM32H757xx",
] # List of H7 boards with dual bank
ELF_NAME_MAPPING = {
'copter': 'arducopter',
'plane': 'arduplane',
'rover': 'ardurover',
'sub': 'ardusub',
'blimp': 'blimp',
'antennatracker': 'antennatracker',
'bootloader': 'AP_Bootloader',
'AP_Periph': 'AP_Periph',
}
def update_settings(bld):
if not bld.cmd in ELF_NAME_MAPPING:
return
board_name = bld.env.BOARD
elf_file_name = ELF_NAME_MAPPING.get(bld.cmd, bld.cmd)
if elf_file_name == 'ap_bootloader':
elf_file_path = os.path.join("${workspaceFolder}", "build", board_name, "bootloader", elf_file_name)
else:
elf_file_path = os.path.join("${workspaceFolder}", "build", board_name, "bin", elf_file_name)
vscode_setting_json_path = os.path.join(bld.srcnode.abspath(), '.vscode', 'settings.json')
if not os.path.exists(vscode_setting_json_path):
with open(vscode_setting_json_path, 'w') as f:
json.dump({}, f, indent=4)
try:
with open(vscode_setting_json_path, 'r') as f:
content = f.read().strip()
if content:
settings_json = json.loads(content)
else:
settings_json = {}
except json.JSONDecodeError:
print(f"VS-LAUNCH: \033[91m Error: invalid JSON in .vscode/settings.json, please fix it and try again.\033[0m")
return
settings_json['wscript.elf_file_path'] = elf_file_path
settings_json['wscript.board'] = board_name
if board_name == 'sitl':
if os.uname().sysname == 'Darwin':
settings_json['wscript.MIMode'] = "lldb"
else:
settings_json['wscript.MIMode'] = "gdb"
with open(vscode_setting_json_path, 'w') as f:
json.dump(settings_json, f, indent=4)
def update_openocd_cfg(cfg):
if cfg.options.board != 'sitl':
openocd_cfg_path = os.path.join(cfg.srcnode.abspath(), 'build', cfg.options.board, 'openocd.cfg')
mcu_type = cfg.env.get_flat('APJ_BOARD_TYPE')
openocd_target = ''
if mcu_type.startswith("STM32H7"):
if mcu_type in H7_DUAL_BANK_LIST:
openocd_target = 'stm32h7_dual_bank.cfg'
else:
openocd_target = 'stm32h7x.cfg'
elif mcu_type.startswith("STM32F7"):
openocd_target = 'stm32f7x.cfg'
elif mcu_type.startswith("STM32F4"):
openocd_target = 'stm32f4x.cfg'
elif mcu_type.startswith("STM32F3"):
openocd_target = 'stm32f3x.cfg'
elif mcu_type.startswith("STM32L4"):
openocd_target = 'stm32l4x.cfg'
elif mcu_type.startswith("STM32G4"):
openocd_target = 'stm32g4x.cfg'
if openocd_target:
with open(openocd_cfg_path, 'w+') as f:
f.write("source [find interface/stlink.cfg]\n")
f.write(f"source [find target/{openocd_target}]\n")
f.write("init\n")
f.write("$_TARGETNAME configure -rtos auto\n")
def init_launch_json_if_not_exist(cfg):
launch_json_path = os.path.join(cfg.srcnode.abspath(), '.vscode', 'launch.json')
launch_default_json_path = os.path.join(cfg.srcnode.abspath(),'.vscode', 'launch.default.json')
if not os.path.exists(launch_json_path):
if os.path.exists(launch_default_json_path):
print(f"Copying {launch_default_json_path} to {launch_json_path}")
shutil.copy(launch_default_json_path, launch_json_path)