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";
7 // implements QuickPickItem does not work somehow
9 public version: string;
10 public sdkPath: string;
11 public toolchainPath: string;
13 constructor(version: string, sdkPath: string, toolchainPath: string) {
14 this.version = version;
15 this.sdkPath = sdkPath;
16 this.toolchainPath = toolchainPath;
20 export interface InstalledSDK {
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");
31 // check if pico-sdk directory exists
32 if (!statSync(picoSDKDirectory).isDirectory()) {
36 Logger.log("No installed sdk found.");
41 // scan foldernames in picoSDKDirectory/sdk
42 const installedSDKs: InstalledSDK[] = [];
44 const versions = readdirSync(picoSDKDirectory);
45 for (const version of versions.filter(
47 /^\d+\.\d+\.\d+$/.test(version) &&
48 statSync(`${picoSDKDirectory}/${version}`).isDirectory()
50 const sdkPath = join(picoSDKDirectory, version);
52 installedSDKs.push({ version, sdkPath });
55 Logger.log("Error while detecting installed SDKs.");
62 let uninstallerPicoSDKs: PicoSDK[] = [];
64 export function queryInstalledSDKsFromUninstallers(): void {
66 const uninstallers = EnumRegKeyKeys(
68 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
71 uninstallers.forEach(element => {
72 if (element.startsWith("Raspberry Pi Pico SDK")) {
74 const installPath = GetStringRegKey(
76 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" +
82 uninstallerPicoSDKs.push(
84 element.split(" ").pop()?.replace("v", "") ?? "0.0.0",
85 join(installPath, "pico-sdk"),
86 join(installPath, "gcc-arm-none-eabi", "bin")
91 Logger.log("No InstallPath found for uninstaller: " + element);
96 Logger.log("Error while fixing registry keys for Windows Pico SDK.");
100 function detectInstalledSDKsWindows(): PicoSDK[] {
102 const sdks = EnumRegKeyKeys(
103 "HKEY_LOCAL_MACHINE",
104 "SOFTWARE\\WOW6432Node\\Raspberry Pi"
107 const locatedSDKs = sdks
109 const installDir = GetStringRegKey(
110 "HKEY_LOCAL_MACHINE",
111 "SOFTWARE\\WOW6432Node\\Raspberry Pi\\" + sdk,
115 const version = sdk.split(" ").pop();
116 if (!installDir || !version) {
121 const finalVersion = version.replace("v", "");
123 uninstallerPicoSDKs = uninstallerPicoSDKs.filter(
124 sdk => sdk.version !== finalVersion
128 version: version.replace("v", ""),
129 sdkPath: join(installDir, "pico-sdk"),
130 toolchainPath: join(installDir, "gcc-arm-none-eabi", "bin"),
133 .filter(sdk => sdk !== undefined) as PicoSDK[];
135 const count = locatedSDKs.push(...uninstallerPicoSDKs);
136 if (count !== uninstallerPicoSDKs.length) {
137 Logger.log("Problems while adding uninstaller SDKs.");
142 return uninstallerPicoSDKs;