瀏覽代碼

ufbt: project & debugging updates (#2572)

* ufbt: removed warning in "channel=dev" update mode
* ufbt: removed API version warning; added get_blackmagic & get_apiversion targets
* ufbt: updater project template to include blackmagic & jlink targets
* ufbt: project template: fixes & updates
* ufbt: project template: added config update shortcut
* sdk: using fixed names for file components
hedger 2 年之前
父節點
當前提交
b9ccb274a7

+ 1 - 1
.gitignore

@@ -30,7 +30,7 @@ bindings/
 Brewfile.lock.json
 Brewfile.lock.json
 
 
 # Visual Studio Code
 # Visual Studio Code
-.vscode/
+/.vscode/
 
 
 # Kate
 # Kate
 .kateproject
 .kateproject

+ 4 - 2
scripts/sconsdist.py

@@ -181,9 +181,9 @@ class Main(App):
         ) as zf:
         ) as zf:
             for component_key in sdk_components_keys:
             for component_key in sdk_components_keys:
                 component_path = self._dist_components.get(component_key)
                 component_path = self._dist_components.get(component_key)
-                components_paths[component_key] = basename(component_path)
 
 
                 if component_key.endswith(".dir"):
                 if component_key.endswith(".dir"):
+                    components_paths[component_key] = basename(component_path)
                     for root, dirnames, files in walk(component_path):
                     for root, dirnames, files in walk(component_path):
                         if "__pycache__" in dirnames:
                         if "__pycache__" in dirnames:
                             dirnames.remove("__pycache__")
                             dirnames.remove("__pycache__")
@@ -199,7 +199,9 @@ class Main(App):
                                 ),
                                 ),
                             )
                             )
                 else:
                 else:
-                    zf.write(component_path, basename(component_path))
+                    # We use fixed names for files to avoid having to regenerate VSCode project
+                    components_paths[component_key] = component_key
+                    zf.write(component_path, component_key)
 
 
             zf.writestr(
             zf.writestr(
                 "components.json",
                 "components.json",

+ 22 - 0
scripts/ufbt/SConstruct

@@ -163,6 +163,18 @@ dist_env.Alias("flash", openocd_target)
 if env["FORCE"]:
 if env["FORCE"]:
     env.AlwaysBuild(openocd_target)
     env.AlwaysBuild(openocd_target)
 
 
+
+firmware_jflash = dist_env.JFlash(
+    dist_env["UFBT_STATE_DIR"].File("jflash"),
+    dist_env["FW_BIN"],
+    JFLASHADDR="0x20000000",
+)
+dist_env.Alias("firmware_jflash", firmware_jflash)
+dist_env.Alias("jflash", firmware_jflash)
+if env["FORCE"]:
+    env.AlwaysBuild(firmware_jflash)
+
+
 firmware_debug = dist_env.PhonyTarget(
 firmware_debug = dist_env.PhonyTarget(
     "debug",
     "debug",
     "${GDBPYCOM}",
     "${GDBPYCOM}",
@@ -391,3 +403,13 @@ AddPostAction(
 dist_env.Precious(app_template_dist)
 dist_env.Precious(app_template_dist)
 dist_env.NoClean(app_template_dist)
 dist_env.NoClean(app_template_dist)
 dist_env.Alias("create", app_template_dist)
 dist_env.Alias("create", app_template_dist)
+
+dist_env.PhonyTarget(
+    "get_blackmagic",
+    "@echo $( ${BLACKMAGIC_ADDR} $)",
+)
+
+dist_env.PhonyTarget(
+    "get_apiversion",
+    "@echo $( ${UFBT_API_VERSION} $)",
+)

+ 30 - 33
scripts/ufbt/project_template/.vscode/launch.json

@@ -2,19 +2,16 @@
     // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
     // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
     "version": "0.2.0",
     "version": "0.2.0",
     "inputs": [
     "inputs": [
-        // {
-        //     "id": "BLACKMAGIC",
-        //     "type": "command",
-        //     "command": "shellCommand.execute",
-        //     "args": {
-        //         "useSingleResult": true,
-        //         "env": {
-        //             "PATH": "${workspaceFolder};${env:PATH}"
-        //         },
-        //         "command": "./fbt get_blackmagic",
-        //         "description": "Get Blackmagic device",
-        //     }
-        // },
+        {
+            "id": "BLACKMAGIC",
+            "type": "command",
+            "command": "shellCommand.execute",
+            "args": {
+                "description": "Get Blackmagic device",
+                "useSingleResult": true,
+                "command": "ufbt -s get_blackmagic",
+            }
+        },
     ],
     ],
     "configurations": [
     "configurations": [
         {
         {
@@ -57,26 +54,26 @@
             ],
             ],
             // "showDevDebugOutput": "raw",
             // "showDevDebugOutput": "raw",
         },
         },
-        // {
-        //     "name": "Attach FW (blackmagic)",
-        //     "cwd": "${workspaceFolder}",
-        //     "executable": "@UFBT_FIRMWARE_ELF@",
-        //     "request": "attach",
-        //     "type": "cortex-debug",
-        //     "servertype": "external",
-        //     "gdbTarget": "${input:BLACKMAGIC}",
-        //     "svdFile": "@UFBT_DEBUG_DIR@/STM32WB55_CM4.svd",
-        //     "rtos": "FreeRTOS",
-        //     "postAttachCommands": [
-        //         "monitor swdp_scan",
-        //         "attach 1",
-        //         "set confirm off",
-        //         "set mem inaccessible-by-default off",
-        //         "source @UFBT_DEBUG_DIR@/flipperapps.py",
-        //         "fap-set-debug-elf-root @UFBT_DEBUG_ELF_DIR@"
-        //     ]
-        //     // "showDevDebugOutput": "raw",
-        // },
+        {
+            "name": "Attach FW (blackmagic)",
+            "cwd": "${workspaceFolder}",
+            "executable": "@UFBT_FIRMWARE_ELF@",
+            "request": "attach",
+            "type": "cortex-debug",
+            "servertype": "external",
+            "gdbTarget": "${input:BLACKMAGIC}",
+            "svdFile": "@UFBT_DEBUG_DIR@/STM32WB55_CM4.svd",
+            "rtos": "FreeRTOS",
+            "postAttachCommands": [
+                "monitor swdp_scan",
+                "attach 1",
+                "set confirm off",
+                "set mem inaccessible-by-default off",
+                "source @UFBT_DEBUG_DIR@/flipperapps.py",
+                "fap-set-debug-elf-root @UFBT_DEBUG_ELF_DIR@"
+            ]
+            // "showDevDebugOutput": "raw",
+        },
         {
         {
             "name": "Attach FW (JLink)",
             "name": "Attach FW (JLink)",
             "cwd": "${workspaceFolder}",
             "cwd": "${workspaceFolder}",

+ 24 - 12
scripts/ufbt/project_template/.vscode/tasks.json

@@ -20,24 +20,30 @@
             "type": "shell",
             "type": "shell",
             "command": "ufbt"
             "command": "ufbt"
         },
         },
+        {
+            "label": "Clean",
+            "group": "build",
+            "type": "shell",
+            "command": "ufbt -c"
+        },
         {
         {
             "label": "Flash FW (ST-Link)",
             "label": "Flash FW (ST-Link)",
             "group": "build",
             "group": "build",
             "type": "shell",
             "type": "shell",
             "command": "ufbt FORCE=1 flash"
             "command": "ufbt FORCE=1 flash"
         },
         },
-        // {
-        //     "label": "[NOTIMPL] Flash FW (blackmagic)",
-        //     "group": "build",
-        //     "type": "shell",
-        //     "command": "ufbt flash_blackmagic"
-        // },
-        // {
-        //     "label": "[NOTIMPL] Flash FW (JLink)",
-        //     "group": "build",
-        //     "type": "shell",
-        //     "command": "ufbt FORCE=1 jflash"
-        // },
+        {
+            "label": "Flash FW (blackmagic)",
+            "group": "build",
+            "type": "shell",
+            "command": "ufbt flash_blackmagic"
+        },
+        {
+            "label": "Flash FW (JLink)",
+            "group": "build",
+            "type": "shell",
+            "command": "ufbt FORCE=1 jflash"
+        },
         {
         {
             "label": "Flash FW (USB, with resources)",
             "label": "Flash FW (USB, with resources)",
             "group": "build",
             "group": "build",
@@ -49,6 +55,12 @@
             "group": "build",
             "group": "build",
             "type": "shell",
             "type": "shell",
             "command": "ufbt update"
             "command": "ufbt update"
+        },
+        {
+            "label": "Update VSCode config for current SDK",
+            "group": "build",
+            "type": "shell",
+            "command": "ufbt vscode_dist"
         }
         }
     ]
     ]
 }
 }

+ 1 - 1
scripts/ufbt/project_template/app_template/application.fam

@@ -6,7 +6,7 @@ App(
     apptype=FlipperAppType.EXTERNAL,
     apptype=FlipperAppType.EXTERNAL,
     entry_point="@FBT_APPID@_app",
     entry_point="@FBT_APPID@_app",
     stack_size=2 * 1024,
     stack_size=2 * 1024,
-    fap_category="Misc",
+    fap_category="Examples",
     # Optional values
     # Optional values
     # fap_version=(0, 1),  # (major, minor)
     # fap_version=(0, 1),  # (major, minor)
     fap_icon="@FBT_APPID@.png",  # 10x10 1-bit PNG
     fap_icon="@FBT_APPID@.png",  # 10x10 1-bit PNG

+ 0 - 6
scripts/ufbt/site_tools/ufbt_state.py

@@ -75,12 +75,6 @@ def generate(env, **kw):
     if not sdk_state["meta"]["hw_target"].endswith(sdk_data["hardware"]):
     if not sdk_state["meta"]["hw_target"].endswith(sdk_data["hardware"]):
         raise StopError("SDK state file doesn't match hardware target")
         raise StopError("SDK state file doesn't match hardware target")
 
 
-    if sdk_state["meta"]["version"] != ufbt_state["version"]:
-        warn(
-            WarningOnByDefault,
-            f"Version mismatch: SDK state vs uFBT: {sdk_state['meta']['version']} vs {ufbt_state['version']}",
-        )
-
     scripts_dir = sdk_current_sdk_dir_node.Dir(sdk_components["scripts.dir"])
     scripts_dir = sdk_current_sdk_dir_node.Dir(sdk_components["scripts.dir"])
     env.SetDefault(
     env.SetDefault(
         # Paths
         # Paths

+ 1 - 1
site_scons/extapps.scons

@@ -1,5 +1,4 @@
 from dataclasses import dataclass, field
 from dataclasses import dataclass, field
-from os.path import dirname
 
 
 from SCons.Node import NodeList
 from SCons.Node import NodeList
 from SCons.Warnings import warn, WarningOnByDefault
 from SCons.Warnings import warn, WarningOnByDefault
@@ -131,6 +130,7 @@ Depends(sdk_source, appenv.ProcessSdkDepends(f"{amalgamated_api}.d"))
 
 
 appenv["SDK_DIR"] = appenv.Dir("${BUILD_DIR}/sdk_headers")
 appenv["SDK_DIR"] = appenv.Dir("${BUILD_DIR}/sdk_headers")
 sdk_header_tree = appenv.SDKHeaderTreeExtractor(appenv["SDK_DIR"], amalgamated_api)
 sdk_header_tree = appenv.SDKHeaderTreeExtractor(appenv["SDK_DIR"], amalgamated_api)
+Depends(sdk_header_tree, appenv["SDK_DEFINITION"])
 # AlwaysBuild(sdk_tree)
 # AlwaysBuild(sdk_tree)
 Alias("sdk_tree", sdk_header_tree)
 Alias("sdk_tree", sdk_header_tree)
 extapps.sdk_tree = sdk_header_tree
 extapps.sdk_tree = sdk_header_tree