]> Git Repo - pico-vscode.git/blob - src/utils/picoSDKUtil.mts
Add elf2uf2 and pioasm for sdk 1.5.1
[pico-vscode.git] / src / utils / picoSDKUtil.mts
1 import { join } from "path";
2 import Logger from "../logger.mjs";
3 //import { EnumRegKeyKeys, GetStringRegKey } from "vscode-windows-registry";
4 import { homedir } from "os";
5 import { readdirSync, statSync } from "fs";
6
7 // implements QuickPickItem does not work somehow
8 export class PicoSDK {
9   public version: string;
10   public sdkPath: string;
11   public toolchainPath: string;
12
13   constructor(version: string, sdkPath: string, toolchainPath: string) {
14     this.version = version;
15     this.sdkPath = sdkPath;
16     this.toolchainPath = toolchainPath;
17   }
18 }
19
20 export interface InstalledSDK {
21   version: string;
22   sdkPath: string;
23 }
24
25 export function detectInstalledSDKs(): InstalledSDK[] {
26   // detect installed sdks by foldernames in $HOME/.pico-sdk/sdk/<version>
27   const homeDirectory = homedir();
28   const picoSDKDirectory = join(homeDirectory, ".pico-sdk", "sdk");
29
30   try {
31     // check if pico-sdk directory exists
32     if (!statSync(picoSDKDirectory).isDirectory()) {
33       return [];
34     }
35   } catch {
36     Logger.log("No installed sdk found.");
37
38     return [];
39   }
40
41   // scan foldernames in picoSDKDirectory/sdk
42   const installedSDKs: InstalledSDK[] = [];
43   try {
44     const versions = readdirSync(picoSDKDirectory);
45     for (const version of versions.filter(
46       version =>
47         /^\d+\.\d+\.\d+$/.test(version) &&
48         statSync(`${picoSDKDirectory}/${version}`).isDirectory()
49     )) {
50       const sdkPath = join(picoSDKDirectory, version);
51
52       installedSDKs.push({ version, sdkPath });
53     }
54   } catch (error) {
55     Logger.log("Error while detecting installed SDKs.");
56   }
57
58   return installedSDKs;
59 }
60
61 /*
62 let uninstallerPicoSDKs: PicoSDK[] = [];
63
64 export function queryInstalledSDKsFromUninstallers(): void {
65   try {
66     const uninstallers = EnumRegKeyKeys(
67       "HKEY_LOCAL_MACHINE",
68       "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
69     );
70
71     uninstallers.forEach(element => {
72       if (element.startsWith("Raspberry Pi Pico SDK")) {
73         try {
74           const installPath = GetStringRegKey(
75             "HKEY_LOCAL_MACHINE",
76             "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" +
77               element,
78             "InstallPath"
79           );
80
81           if (installPath) {
82             uninstallerPicoSDKs.push(
83               new PicoSDK(
84                 element.split(" ").pop()?.replace("v", "") ?? "0.0.0",
85                 join(installPath, "pico-sdk"),
86                 join(installPath, "gcc-arm-none-eabi", "bin")
87               )
88             );
89           }
90         } catch (error) {
91           Logger.log("No InstallPath found for uninstaller: " + element);
92         }
93       }
94     });
95   } catch (error) {
96     Logger.log("Error while fixing registry keys for Windows Pico SDK.");
97   }
98 }
99
100 function detectInstalledSDKsWindows(): PicoSDK[] {
101   try {
102     const sdks = EnumRegKeyKeys(
103       "HKEY_LOCAL_MACHINE",
104       "SOFTWARE\\WOW6432Node\\Raspberry Pi"
105     );
106
107     const locatedSDKs = sdks
108       .map(sdk => {
109         const installDir = GetStringRegKey(
110           "HKEY_LOCAL_MACHINE",
111           "SOFTWARE\\WOW6432Node\\Raspberry Pi\\" + sdk,
112           "InstallPath"
113         );
114
115         const version = sdk.split(" ").pop();
116         if (!installDir || !version) {
117           return undefined;
118         }
119
120         // avoid duplicates
121         const finalVersion = version.replace("v", "");
122
123         uninstallerPicoSDKs = uninstallerPicoSDKs.filter(
124           sdk => sdk.version !== finalVersion
125         );
126
127         return {
128           version: version.replace("v", ""),
129           sdkPath: join(installDir, "pico-sdk"),
130           toolchainPath: join(installDir, "gcc-arm-none-eabi", "bin"),
131         } as PicoSDK;
132       })
133       .filter(sdk => sdk !== undefined) as PicoSDK[];
134
135     const count = locatedSDKs.push(...uninstallerPicoSDKs);
136     if (count !== uninstallerPicoSDKs.length) {
137       Logger.log("Problems while adding uninstaller SDKs.");
138     }
139
140     return locatedSDKs;
141   } catch (error) {
142     return uninstallerPicoSDKs;
143   }
144 }
145 */
This page took 0.032277 seconds and 4 git commands to generate.