VSCode, Define custom variables to use in tasks, lauch and cpp properties - visual-studio-code

I am setting up VSCode for Embedded development with Nordic NRF52.
I have noticed that in the nrf_sdk there are examples for several boards and several soft devices.
I have seen that it is possible to reference env variables that have been previously defined both in tasks, launch and extension properties, such as: c_cpp, stm32-for-vscode. But what about having a section in the workspace file defined as my_vars so the workspace file looks like this?
{
"my_vars": {
"BOARD_NAME": "NRF52840_MDK_USB_DONGLE",
"MCU_NAME": "NRF52840",
"SOFT_DEVICE": "S140",
"BOARD_VARIANT_PATH": "/pca10059/mbr"
},
"launch": {
"version": "0.2.0",
"configurations": [
{
"name": "Cortex Debug",
"cwd": "${workspaceRoot}",
"executable": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc/_build/${my_vars:MCU_NAME}_xxaa.out",
"request": "launch",
"type": "cortex-debug",
"servertype": "jlink",
"device": "nrf52",
"interface": "swd",
"ipAddress": null,
"serialNumber": null,
"armToolchainPath": "${env:VSARM}/armcc/bin/"
},
]
},
"folders": [
{
"path": "."
}
],
"settings":{
// "C_Cpp.name": "nRF52840 DK",
"C_Cpp.default.includePath": [
"${workspaceFolder}/**",
"${env:GNU_GCC}/arm-none-eabi/include",
"${env:NRF_SDK}/modules/**",
"${env:NRF_SDK}/components/**"
],
"C_Cpp.default.defines": [
"${my_vars:BOARD_NAME}",
"CONFIG_GPIO_AS_PINRESET",
"INITIALIZE_USER_SECTIONS",
"FLOAT_ABI_HARD",
"NRF52",
"${my_vars:MCU_NAME}_XXAA",
"NRF_SD_BLE_API_VERSION=6",
"${my_vars:SOFT_DEVICE}",
"SOFTDEVICE_PRESENT",
"SWI_DISABLE0"
],
"C_Cpp.default.compilerPath": "${env:GNU_GCC}/bin/arm-none-eabi-gcc",
"C_Cpp.default.cStandard": "c11",
"C_Cpp.default.cppStandard": "c++17",
"C_Cpp.default.intelliSenseMode": "clang-x64"
},
"tasks": {
"version": "2.0.0",
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"tasks": [
{
"label": "nRF52 build",
"type": "shell",
"command": "make",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "nRF52 build clean",
"type": "shell",
"command": "make clean",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "nRF52 flash",
"type": "shell",
"command": "make flash",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
},
{
"label": "nRF52 dfu upload",
"type": "shell",
"command": "make bootload",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
},
{
"label": "nRF52 flash_softdevice",
"type": "shell",
"command": "make flash_softdevice",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
},
},
{
"label": "nRF52 sdk_config",
"type": "shell",
"command": "make sdk_config",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"problemMatcher": []
},
{
"label": "nRF52 erase",
"type": "shell",
"command": "make erase",
"options": {
"cwd": "${workspaceFolder}${my_vars:BOARD_VARIANT_PATH}/armgcc"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
},
}
]
}
}
I tried having a task which is set_env, which in my case, since I am in Windows, run a batch script that does:
set BOARD_NAME=NRF52840_MDK_USB_DONGLE
set MCU_NAME=NRF52840
set SOFT_DEVICE=S140
set BOARD_VARIANT_PATH=/pca10059/mbr
This will ease a lot playing around with the SDK examples and could be potential work for a NRF52 VSCode extension, as https://marketplace.visualstudio.com/items?itemName=bmd.stm32-for-vscode does.

You've undoubtedly solved this problem by now, but hopefully I can save someone else some searching.
There is a top-level section called env that holds global variables that you can reference in your configs.
Here's an example from MSDN.
{
"env": {
"myDefaultIncludePath": ["${workspaceFolder}", "${workspaceFolder}/include"],
"myCompilerPath": "/usr/local/bin/gcc-7"
},
"configurations": [
{
"name": "Mac",
"intelliSenseMode": "clang-x64",
"includePath": ["${myDefaultIncludePath}", "/another/path"],
"macFrameworkPath": ["/System/Library/Frameworks"],
"defines": ["FOO", "BAR=100"],
"forcedInclude": ["${workspaceFolder}/include/config.h"],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++17",
"compileCommands": "/path/to/compile_commands.json",
"browse": {
"path": ["${workspaceFolder}"],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
}
}
],
"version": 4
}

Have a look at the extension Command Variable.
It can use the content of a file as key-value pairs.

Related

How can I run one task without finishing another in vscode?

i'm developing embedded firmware on zephyr RTOS. Zephyr env. works on WSL2. And "Vscode remote client" works in Win10 "Vscode Server" works on Ununtu 22.04.
I use Jlink debbugger for flashing and debugging firmware. I have to use remote debugging because debugger connected to Win10 via USB. So I run the JLink "JLinkRemoteServerCL.exe" in Win10 before flash or debug.
But every time I plug or unplug the USB into the PC JLink Remote Connection disconnects. This is annoying.
My goal is to automatically run "JLinkRemoteServerCL.exe" when I run the flash task and close it after the flash task is complete.
I wrote two task for it and connect the flash task to start "JLinkRemoteServerCL.exe" task with "dependsOn" property. But Flash task doesn't start because when start to "JLinkRemoteServerCL.exe" task, it waits connection and never finish.
I do not know how to kill the "Start Remote Server" task even if i achieve run the "Flash" task.
How can I flash my MCU's with run only 1 task?
{
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"command": "west",
"type": "shell",
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
},
"args": [
"build",
"--pristine",
"-b",
"${input:board}",
"-d",
"builds/build_${input:board}",
"--",
"-DBOARD_ROOT=../Common",
"-DCONF_FILE=prj.conf",
"-DOVERLAY_CONFIG=configs/prj_${input:board}.conf",
"-DDTC_OVERLAY_FILE=boards/${input:board}.overlay"
],
"problemMatcher": [
"$gcc"
],
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
}
},
{
"label": "Build MCUBOOT",
"command": "west",
"type": "shell",
"options": {
"cwd": "${workspaceFolder}"
},
"args": [
"build",
"$ZEPHYR_BASE/../bootloader/mcuboot/boot/zephyr",
"--pristine",
"-b",
"${input:board}",
"-d",
"builds/build_${input:board}/bootloader/mcuboot",
"--",
"-DBOARD_ROOT=${cwd}/../Common",
"-DOVERLAY_CONFIG=${cwd}/bootloader_configs/prj_mcuboot_${input:board}.conf",
"-DDTC_OVERLAY_FILE=${cwd}/boards/${input:board}.overlay",
"-DCONFIG_BOOT_SIGNATURE_KEY_FILE=\\\"${cwd}/../Common/keys/${input:key}\\\""
],
"problemMatcher": [
"$gcc"
],
"presentation": {
"reveal": "always"
},
},
{
"label": "Flash",
"command": "west",
"type": "shell",
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
},
"args": [
"flash",
"-d",
"builds/build_${input:board}",
"--hex-file",
"builds/build_${input:board}/zephyr/zephyr.bin",
"-r",
"jlink",
"--tool-opt=ip 192.168.0.21"
],
"dependsOn" : "Start JLink Remote Server"
},
{
"label": "Flash with MCUBOOT",
"command": "west",
"type": "shell",
"group": "build",
"options": {
"cwd": "${workspaceFolder}"
},
"args": [
"flash",
"-d",
"builds/build_${input:board}",
"--hex-file",
"builds/build_${input:board}/merged.hex",
"-r",
"jlink",
"--tool-opt=ip 192.168.0.21"
],
"dependsOn" : "Start JLink Remote Server"
},
{
"label": "Sign",
"command": "west",
"type": "shell",
"options": {
"cwd": "${workspaceFolder}"
},
"args": [
"sign",
"-t",
"imgtool",
"-d",
"builds/build_${input:board}",
"--",
"--version",
"${input:version_num}",
"--key",
"${workspaceFolder}/../Common/keys/${input:key}"
]
},
{
"label": "Build With MCUBOOT",
"command": "python3",
"type": "shell",
"group": "build",
"args": [
"$ZEPHYR_BASE/scripts/build/mergehex.py",
"builds/build_${input:board}/zephyr/zephyr.signed.hex",
"builds/build_${input:board}/bootloader/mcuboot/zephyr/zephyr.hex",
"-o",
"builds/build_${input:board}/merged.hex"
],
"dependsOn":["Get Inputs", "Build", "Build MCUBOOT", "Sign"],
"dependsOrder": "sequence"
},
{
"label": "Start JLink Remote Server",
"type": "shell",
"command": "/mnt/c/Program\\ Files/SEGGER/JLink/JLinkRemoteServerCL.exe",
},
{
"label": "Get Inputs",
"type": "shell",
"command": "echo",
"args": [
"Board:",
"\b${input:board}",
"Key:",
"\b${input:key}",
"Version:",
"\b${input:version_num}"
],
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": true
}
}
],
"inputs": [
{
"id": "board",
"description": "Zephyr Target Board",
"default": "witag_litum",
"type": "pickString",
"options":[
"witag_litum",
"nucleo_l073rz",
"witag_bdcip",
"witag",
"tsg001",
"ft06dch",
"eagleeyesense",
"lowcost",
"nrf52833dk_nrf52833",
"nrf52840dongle_nrf52840",
]
},
{
"id": "version_num",
"description": "Version Number:",
"default": "100.100.1+0",
"type": "promptString"
},
{
"id": "key",
"description": "MCUBOOT KEY file located in Common/keys",
"default": "witag_litum",
"type": "pickString",
"options":[
"WiTag.pem",
"WiTag_Litum.pem",
"root-rsa-2048.pem"
]
}
]
}

vscode tasks.json transform pickfile

I have next vscode tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "${userHome}/build.py",
"args": ["param_def=${input:pickBuild}"]
}
],
"inputs": [
{
"id": "pickBuild",
"type": "command",
"command": "extension.commandvariable.file.pickFile",
"args": {
"include": "**/default_*.py",
"description": "Select build",
"display": "fileName",
}
}
]}
when run:
actual: /home/user/build.py param_def=/home/user/default_android.py
expected: /home/user/build.py param_def=default_android
P.S: I have tried use extension.commandvariable.transform, but did not success
You can use the following config in your tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "${userHome}/build.py",
"args": ["param_def=${input:pickBuild}"]
}
],
"inputs": [
{
"id": "pickBuild",
"type": "command",
"command": "extension.commandvariable.transform",
"args": {
"text": "${pickFile:build}",
"find": "^.*/(.*).py",
"replace": "$1",
"pickFile": {
"build": {
"include": "**/default_*.py",
"description": "Select build",
"display": "fileName",
}
}
}
}
]}

VS Code cannot find similar task, only the last one

The closest to my issue is this SO question, but I think something else is going on here. I have two launch configurations each which call a similar preLaunch task, start-local and start-dev. The body of these two tasks is almost identical, except that VS Code can only find whichever of these is declared last in the task.json file. I tested this by duplicating the first task and simply changing the label, and none but the last task can ever be found. Is this a bug or am I doing something wrong? Pasting my configs for reference:
VS Code Version: 1.72.2
OS Version: MacOS 12.6
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Start Dev",
"type": "chrome",
"request": "launch",
"url": "http://localhost:3000",
"webRoot": "${workspaceFolder}",
"preLaunchTask": "start-dev",
"postDebugTask": "Terminate All Tasks"
},
{
"name": "Start Local",
"type": "chrome",
"request": "launch",
"url": "http://localhost:3001",
"webRoot": "${workspaceFolder}",
"preLaunchTask": "start-local",
"postDebugTask": "Terminate All Tasks"
},
]
}
task.json
{
"version": "2.0.0",
"tasks": [
{
"label": "start-local",
"type": "npm",
"script": "start",
"isBackground": true,
"problemMatcher": {
"owner": "npm",
"background": {
"activeOnStart": true,
"beginsPattern": ".*",
"endsPattern": "To ignore, add.*eslint-disable-next-line to the line before.*"
},
"pattern": {
"regexp": ""
}
},
"dependsOrder": "sequence",
"dependsOn": [
"setup-local-env"
]
},
{
"label": "setup-local-env",
"command": "echo REACT_APP_STAGE=local > ./.env; echo BROWSER=none >> ./.env",
"type": "shell",
"presentation": {
"echo": false,
"reveal": "never",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": false,
"close": true
}
},
{
"label": "start-dev",
"type": "npm",
"script": "start",
"isBackground": true,
"problemMatcher": {
"owner": "npm",
"background": {
"activeOnStart": true,
"beginsPattern": ".*",
"endsPattern": "To ignore, add.*eslint-disable-next-line to the line before.*"
},
"pattern": {
"regexp": ""
}
},
"dependsOrder": "sequence",
"dependsOn": [
"setup-dev-env"
]
},
{
"label": "setup-dev-env",
"command": "echo REACT_APP_STAGE=dev > ./.env; echo BROWSER=none >> ./.env",
"type": "shell",
"presentation": {
"echo": false,
"reveal": "never",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": false,
"close": true
}
},
{
"label": "Terminate All Tasks",
"command": "echo ${input:terminate}",
"type": "shell",
"problemMatcher": []
},
],
"inputs": [
{
"id": "terminate",
"type": "command",
"command": "workbench.action.tasks.terminate",
"args": "terminateAll"
}
]
}

How Do I Set Task as preLaunchTask in .code-workspace?

I have a multi-root workspace with launch configurations and tasks. The tasks run fine on their own, but they don't run when added as a preLaunchTask. VS Code throws the error "Could not find the task".
oving them to a tasks.json file is not an option for me.
Here's the relevant information from my .code-worspace file
{
"folders": [
{
"name": "App",
"path": "app"
},
{
"name": "API",
"path": "api"
},
],
"settings": {},
"launch": {
"configurations": [
{
"name": "Launch App",
"type": "chrome",
"request": "launch",
"preLaunchTask": "npm: start",
"cwd": "${workspaceFolder:App}",
"url": "http://localhost:3000",
"webRoot": "${workspaceFolder:App}/src",
"sourceMapPathOverrides": {
"webpack:///src/*": "${webRoot}/*"
}
}
]
},
"tasks": {
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "start",
"label": "npm: start",
"detail": "react-scripts start",
"options": {
"cwd": "${workspaceFolder:App}"
},
"problemMatcher": []
}
]
}
}
I don't know why, but this only happens if type = npm.
Change:
"type": "npm",
"script": "start",
to:
"type": "shell",
"command": "npm start",

VScode debug mode shows "Could not find the specified task"

When trying to start a Debug session in vscode, it throws an error about not finding a specified task. I've already tried the solutions of other SO questions like this but without success.
launch.json:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
...
},
{
"name": "MSEventHubs_Audit",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/audit-events.py",
"console": "integratedTerminal",
"args": [
"config/config.ini",
],
"envFile": "${workspaceFolder}/.env",
"env": {"PYTHONPATH": "${workspaceRoot}"},
"justMyCode": false,
"preLaunchTask": {
"task": "audit_tunnel"
}
},
{
...
},
]
}
tasks.json:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"command": "",
"args": [],
"tasks": [
{
"label": "activate_key",
"type": "shell",
"command": "smartOS_card_pin.sh",
"args": [
"${inputs:cardos_pass}"
],
"group": "build",
},
{
"label": "audit_tunnel",
"type": "shell",
"group": "build",
"command": "ssh",
"args": [
"-NL",
"port1:127.0.0.1:port2",
"my_host"
],
"dependsOn": "activate_key"
},
{
...
}
],
"inputs": [
{
"id": "cardos_pass",
"type": "promptString",
"password": true
}
]
}
I've been looking at it for a while and cannot figure out what I'm doing wrong. The proof my task is known by vscode is when the pop-up message appears
I click 'Configure Task', the 'audit_tunnel' appears as an option to edit.
What am I missing?
Change:
"preLaunchTask": {
"task": "audit_tunnel"
}
To:
"preLaunchTask": "audit_tunnel"