Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ardupilot
GitHub Repository: Ardupilot/ardupilot
Path: blob/master/Tools/ardupilotwaf/vscode_helper.py
4182 views
1
# flake8: noqa
2
3
import os
4
import json
5
import shutil
6
7
H7_DUAL_BANK_LIST = [
8
"STM32H7A3xx",
9
"STM32H7A3xxq",
10
"STM32H7B3xx",
11
"STM32H7B3xxq",
12
"STM32H742xx",
13
"STM32H743xx",
14
"STM32H745xg",
15
"STM32H745xx",
16
"STM32H747xg",
17
"STM32H747xx",
18
"STM32H753xx",
19
"STM32H755xx",
20
"STM32H755xx",
21
"STM32H757xx",
22
] # List of H7 boards with dual bank
23
24
ELF_NAME_MAPPING = {
25
'copter': 'arducopter',
26
'plane': 'arduplane',
27
'rover': 'ardurover',
28
'sub': 'ardusub',
29
'blimp': 'blimp',
30
'antennatracker': 'antennatracker',
31
'bootloader': 'AP_Bootloader',
32
'AP_Periph': 'AP_Periph',
33
}
34
35
def update_settings(bld):
36
if not bld.cmd in ELF_NAME_MAPPING:
37
return
38
board_name = bld.env.BOARD
39
elf_file_name = ELF_NAME_MAPPING.get(bld.cmd, bld.cmd)
40
if elf_file_name == 'ap_bootloader':
41
elf_file_path = os.path.join("${workspaceFolder}", "build", board_name, "bootloader", elf_file_name)
42
else:
43
elf_file_path = os.path.join("${workspaceFolder}", "build", board_name, "bin", elf_file_name)
44
vscode_setting_json_path = os.path.join(bld.srcnode.abspath(), '.vscode', 'settings.json')
45
46
if not os.path.exists(vscode_setting_json_path):
47
with open(vscode_setting_json_path, 'w') as f:
48
json.dump({}, f, indent=4)
49
50
try:
51
with open(vscode_setting_json_path, 'r') as f:
52
content = f.read().strip()
53
if content:
54
settings_json = json.loads(content)
55
else:
56
settings_json = {}
57
except json.JSONDecodeError:
58
print(f"VS-LAUNCH: \033[91m Error: invalid JSON in .vscode/settings.json, please fix it and try again.\033[0m")
59
return
60
61
settings_json['wscript.elf_file_path'] = elf_file_path
62
settings_json['wscript.board'] = board_name
63
if board_name == 'sitl':
64
if os.uname().sysname == 'Darwin':
65
settings_json['wscript.MIMode'] = "lldb"
66
else:
67
settings_json['wscript.MIMode'] = "gdb"
68
69
with open(vscode_setting_json_path, 'w') as f:
70
json.dump(settings_json, f, indent=4)
71
72
def update_openocd_cfg(cfg):
73
if cfg.options.board != 'sitl':
74
openocd_cfg_path = os.path.join(cfg.srcnode.abspath(), 'build', cfg.options.board, 'openocd.cfg')
75
mcu_type = cfg.env.get_flat('APJ_BOARD_TYPE')
76
openocd_target = ''
77
if mcu_type.startswith("STM32H7"):
78
if mcu_type in H7_DUAL_BANK_LIST:
79
openocd_target = 'stm32h7_dual_bank.cfg'
80
else:
81
openocd_target = 'stm32h7x.cfg'
82
elif mcu_type.startswith("STM32F7"):
83
openocd_target = 'stm32f7x.cfg'
84
elif mcu_type.startswith("STM32F4"):
85
openocd_target = 'stm32f4x.cfg'
86
elif mcu_type.startswith("STM32F3"):
87
openocd_target = 'stm32f3x.cfg'
88
elif mcu_type.startswith("STM32L4"):
89
openocd_target = 'stm32l4x.cfg'
90
elif mcu_type.startswith("STM32G4"):
91
openocd_target = 'stm32g4x.cfg'
92
93
if openocd_target:
94
with open(openocd_cfg_path, 'w+') as f:
95
f.write("source [find interface/stlink.cfg]\n")
96
f.write(f"source [find target/{openocd_target}]\n")
97
f.write("init\n")
98
f.write("$_TARGETNAME configure -rtos auto\n")
99
100
def init_launch_json_if_not_exist(cfg):
101
launch_json_path = os.path.join(cfg.srcnode.abspath(), '.vscode', 'launch.json')
102
launch_default_json_path = os.path.join(cfg.srcnode.abspath(),'.vscode', 'launch.default.json')
103
104
if not os.path.exists(launch_json_path):
105
if os.path.exists(launch_default_json_path):
106
print(f"Copying {launch_default_json_path} to {launch_json_path}")
107
shutil.copy(launch_default_json_path, launch_json_path)
108
109