From 273a39d260dd3f83094916481b83b51dd32c7516 Mon Sep 17 00:00:00 2001 From: Zhiquan Yeo Date: Mon, 18 Sep 2023 13:52:48 -0400 Subject: [PATCH] Additional support for XRP/Romi --- build.gradle | 14 ++++++++++ .../resources/gradle/cppxrp/build.gradle | 8 ++---- .../resources/gradle/javaxrp/build.gradle | 8 ++---- vscode-wpilib/src/shared/examples.ts | 6 ++-- vscode-wpilib/src/shared/generator.ts | 28 +++++++++++++++++-- vscode-wpilib/src/shared/templates.ts | 6 ++-- vscode-wpilib/src/shared/vendorexamples.ts | 6 ++-- .../src/webviews/gradle2020import.ts | 4 +-- .../src/generatorscript.ts | 4 +-- 9 files changed, 62 insertions(+), 22 deletions(-) diff --git a/build.gradle b/build.gradle index 7177a671..e8347860 100644 --- a/build.gradle +++ b/build.gradle @@ -73,10 +73,24 @@ def downloadNewCommands = tasks.register('downloadNewCommands', Download) { overwrite true } +def downloadRomiVendordep = tasks.register('downloadRomiVendordep', Download) { + src 'https://raw.githubusercontent.com/wpilibsuite/allwpilib/main/romiVendordep/RomiVendordep.json' + dest 'vscode-wpilib/resources/vendordeps/RomiVendordep.json' + overwrite true +} + +def downloadXRPVendordep = tasks.register('downloadXRPVendordep', Download) { + src 'https://raw.githubusercontent.com/wpilibsuite/allwpilib/main/xrpVendordep/XRPVendordep.json' + dest 'vscode-wpilib/resources/vendordeps/XRPVendordep.json' + overwrite true +} + task copyFromVsCodeToStandaloneResources(type: Copy) { dependsOn extractCppDependencies dependsOn extractJavaDependencies dependsOn downloadNewCommands + dependsOn downloadRomiVendordep + dependsOn downloadXRPVendordep from ('vscode-wpilib/resources/java') { into 'java' } diff --git a/vscode-wpilib/resources/gradle/cppxrp/build.gradle b/vscode-wpilib/resources/gradle/cppxrp/build.gradle index bad3e9ed..18f4a565 100644 --- a/vscode-wpilib/resources/gradle/cppxrp/build.gradle +++ b/vscode-wpilib/resources/gradle/cppxrp/build.gradle @@ -8,11 +8,9 @@ plugins { wpi.sim.addGui().defaultEnabled = true wpi.sim.addDriverstation() -//Sets the websocket client remote host. -wpi.sim.envVar("HALSIMWS_HOST", "192.168.42.1") -wpi.sim.envVar("HALSIMWS_FILTERS", "AIO,DIO,DriverStation,Encoder,Gyro,XRPMotor,XRPServo") -wpi.sim.addWebsocketsServer().defaultEnabled = true -wpi.sim.addWebsocketsClient().defaultEnabled = true +//Sets the XRP Client Host +wpi.sim.envVar("HALSIMXRP_HOST", "192.168.42.1") +wpi.sim.addXRPClient().defaultEnabled = true model { components { diff --git a/vscode-wpilib/resources/gradle/javaxrp/build.gradle b/vscode-wpilib/resources/gradle/javaxrp/build.gradle index 01e452d8..2a12f031 100644 --- a/vscode-wpilib/resources/gradle/javaxrp/build.gradle +++ b/vscode-wpilib/resources/gradle/javaxrp/build.gradle @@ -41,11 +41,9 @@ test { wpi.sim.addGui().defaultEnabled = true wpi.sim.addDriverstation() -//Sets the websocket client remote host. -wpi.sim.envVar("HALSIMWS_HOST", "192.168.42.1") -wpi.sim.envVar("HALSIMWS_FILTERS", "AIO,DIO,DriverStation,Encoder,Gyro,XRPMotor,XRPServo") -wpi.sim.addWebsocketsServer().defaultEnabled = true -wpi.sim.addWebsocketsClient().defaultEnabled = true +//Sets the XRP Client Host +wpi.sim.envVar("HALSIMXRP_HOST", "192.168.42.1") +wpi.sim.addXRPClient().defaultEnabled = true // Setting up my Jar File. In this case, adding all libraries into the main jar ('fat jar') // in order to make them all available at runtime. Also adding the manifest so WPILib diff --git a/vscode-wpilib/src/shared/examples.ts b/vscode-wpilib/src/shared/examples.ts index 2b5d0591..6087902e 100644 --- a/vscode-wpilib/src/shared/examples.ts +++ b/vscode-wpilib/src/shared/examples.ts @@ -15,6 +15,7 @@ export interface IExampleJsonLayout { foldername: string; gradlebase: string; commandversion: number; + extravendordeps?: string[]; } export class Examples { @@ -31,6 +32,7 @@ export class Examples { } const examples: IExampleJsonLayout[] = jsonc.parse(data) as IExampleJsonLayout[]; for (const e of examples) { + const extraVendordeps: string[] = (e.extravendordeps !== undefined) ? e.extravendordeps : []; const provider: IExampleTemplateCreator = { getLanguage(): string { return java ? 'java' : 'cpp'; @@ -46,13 +48,13 @@ export class Examples { if (java) { if (!await generateCopyJava(resourceRoot, path.join(examplesFolder, e.foldername), path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, 'frc.robot.Main', path.join('frc', 'robot'), - false)) { + false, extraVendordeps)) { vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder')); return false; } } else { if (!await generateCopyCpp(resourceRoot, path.join(examplesFolder, e.foldername), - path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, false, false)) { + path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, false, false, extraVendordeps)) { vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder')); return false; } diff --git a/vscode-wpilib/src/shared/generator.ts b/vscode-wpilib/src/shared/generator.ts index eb43dab1..6c5ab8fa 100644 --- a/vscode-wpilib/src/shared/generator.ts +++ b/vscode-wpilib/src/shared/generator.ts @@ -9,7 +9,7 @@ import { setExecutePermissions } from './permissions'; type CopyCallback = (srcFolder: string, rootFolder: string) => Promise; export async function generateCopyCpp(resourcesFolder: string, fromTemplateFolder: string | CopyCallback, fromGradleFolder: string, toFolder: string, - addCpp: boolean, directGradleImport: boolean): Promise { + addCpp: boolean, directGradleImport: boolean, extraVendordeps: string[]): Promise { try { const existingFiles = await readdirAsync(toFolder); if (existingFiles.length > 0) { @@ -96,6 +96,18 @@ export async function generateCopyCpp(resourcesFolder: string, fromTemplateFolde const vendorFile = path.join(path.dirname(resourcesFolder), 'vendordeps', commandName); await copyFileAsync(vendorFile, path.join(vendorDir, commandName)); + for (const vendordep of extraVendordeps) { + if (vendordep === 'romi') { + const romiVendordepName = 'RomiVendordep.json'; + const romiVendordepFile = path.join(path.dirname(resourcesFolder), 'vendordeps', romiVendordepName); + await copyFileAsync(romiVendordepFile, path.join(vendorDir, romiVendordepName)); + } else if (vendordep === 'xrp') { + const xrpVendordepName = 'XRPVendordep.json'; + const xrpVendordepFile = path.join(path.dirname(resourcesFolder), 'vendordeps', xrpVendordepName); + await copyFileAsync(xrpVendordepFile, path.join(vendorDir, xrpVendordepName)); + } + } + return true; } catch (e) { logger.error('Project creation failure', e); @@ -104,7 +116,7 @@ export async function generateCopyCpp(resourcesFolder: string, fromTemplateFolde } export async function generateCopyJava(resourcesFolder: string, fromTemplateFolder: string | CopyCallback, fromGradleFolder: string, toFolder: string, - robotClassTo: string, copyRoot: string, directGradleImport: boolean, + robotClassTo: string, copyRoot: string, directGradleImport: boolean, extraVendordeps: string[], packageReplaceString?: string | undefined): Promise { try { const existingFiles = await readdirAsync(toFolder); @@ -236,6 +248,18 @@ to get a proper path relative to the deploy directory.` ])); const vendorFile = path.join(path.dirname(resourcesFolder), 'vendordeps', commandName); await copyFileAsync(vendorFile, path.join(vendorDir, commandName)); + for (const vendordep of extraVendordeps) { + if (vendordep === 'romi') { + const romiVendordepName = 'RomiVendordep.json'; + const romiVendordepFile = path.join(path.dirname(resourcesFolder), 'vendordeps', romiVendordepName); + await copyFileAsync(romiVendordepFile, path.join(vendorDir, romiVendordepName)); + } else if (vendordep === 'xrp') { + const xrpVendordepName = 'XRPVendordep.json'; + const xrpVendordepFile = path.join(path.dirname(resourcesFolder), 'vendordeps', xrpVendordepName); + await copyFileAsync(xrpVendordepFile, path.join(vendorDir, xrpVendordepName)); + } + } + return true; } catch (e) { logger.error('Project creation failure', e); diff --git a/vscode-wpilib/src/shared/templates.ts b/vscode-wpilib/src/shared/templates.ts index bfe745dc..ad63cc8e 100644 --- a/vscode-wpilib/src/shared/templates.ts +++ b/vscode-wpilib/src/shared/templates.ts @@ -15,6 +15,7 @@ export interface ITemplateJsonLayout { foldername: string; gradlebase: string; commandversion: number; + extravendordeps?: string[]; } export class Templates { @@ -31,6 +32,7 @@ export class Templates { } const templates: ITemplateJsonLayout[] = jsonc.parse(data) as ITemplateJsonLayout[]; for (const e of templates) { + const extraVendordeps: string[] = (e.extravendordeps !== undefined) ? e.extravendordeps : []; const provider: IExampleTemplateCreator = { getLanguage(): string { return java ? 'java' : 'cpp'; @@ -46,13 +48,13 @@ export class Templates { if (java) { if (!await generateCopyJava(resourceRoot, path.join(templatesFolder, e.foldername), path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, 'frc.robot.Main', path.join('frc', 'robot'), - false)) { + false, extraVendordeps)) { vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder')); return false; } } else { if (!await generateCopyCpp(resourceRoot, path.join(templatesFolder, e.foldername), - path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, false, false)) { + path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, false, false, extraVendordeps)) { vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder')); return false; } diff --git a/vscode-wpilib/src/shared/vendorexamples.ts b/vscode-wpilib/src/shared/vendorexamples.ts index 1ddb202b..c3b173c9 100644 --- a/vscode-wpilib/src/shared/vendorexamples.ts +++ b/vscode-wpilib/src/shared/vendorexamples.ts @@ -21,6 +21,7 @@ interface IJsonExample { packagetoreplace?: string | undefined; dependencies: string[]; foldername: string; + extravendordeps?: string[]; } // tslint:disable-next-line:no-any @@ -57,6 +58,7 @@ export async function addVendorExamples(resourceRoot: string, core: IExampleTemp // Only handle java and cpp continue; } + const extraVendordeps: string[] = (ex.extravendordeps !== undefined) ? ex.extravendordeps : []; const provider: IExampleTemplateCreator = { getLanguage(): string { return ex.language; @@ -72,13 +74,13 @@ export async function addVendorExamples(resourceRoot: string, core: IExampleTemp if (ex.language === 'java') { if (!await generateCopyJava(shimmedResourceRoot, path.join(exampleDir, ex.foldername), path.join(gradleBasePath, ex.gradlebase), folderInto.fsPath, 'frc.robot.' + ex.mainclass, - path.join('frc', 'robot'), false, ex.packagetoreplace)) { + path.join('frc', 'robot'), false, extraVendordeps, ex.packagetoreplace)) { vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder')); return false; } } else { if (!await generateCopyCpp(shimmedResourceRoot, path.join(exampleDir, ex.foldername), - path.join(gradleBasePath, ex.gradlebase), folderInto.fsPath, false, false)) { + path.join(gradleBasePath, ex.gradlebase), folderInto.fsPath, false, false, extraVendordeps)) { vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder')); return false; } diff --git a/vscode-wpilib/src/webviews/gradle2020import.ts b/vscode-wpilib/src/webviews/gradle2020import.ts index 1a1e6f71..f03aca5f 100644 --- a/vscode-wpilib/src/webviews/gradle2020import.ts +++ b/vscode-wpilib/src/webviews/gradle2020import.ts @@ -249,11 +249,11 @@ export class Gradle2020Import extends WebViewBase { if (cpp) { const gradlePath = path.join(gradleBasePath, data.romi ? 'cppromi' : 'cpp'); success = await generateCopyCpp(path.join(resourceRoot, 'cpp'), path.join(oldProjectPath, 'src'), gradlePath, toFolder, - false, true); + false, true, []); } else { const gradlePath = path.join(gradleBasePath, data.romi ? 'javaromi' : 'java'); success = await generateCopyJava(path.join(resourceRoot, 'java'), path.join(oldProjectPath, 'src'), gradlePath, toFolder, - javaRobotPackage, '', true); + javaRobotPackage, '', true, []); } if (!success) { diff --git a/wpilib-utility-standalone/src/generatorscript.ts b/wpilib-utility-standalone/src/generatorscript.ts index 9717d8e2..8028384f 100644 --- a/wpilib-utility-standalone/src/generatorscript.ts +++ b/wpilib-utility-standalone/src/generatorscript.ts @@ -211,7 +211,7 @@ async function handleCppCreate(_item: IDisplayJSON, _srcRoot: string): Promise