Skip to content

Commit b790545

Browse files
authored
Additional support for XRP/Romi (#621)
1 parent 37b00d5 commit b790545

File tree

9 files changed

+62
-22
lines changed

9 files changed

+62
-22
lines changed

build.gradle

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,24 @@ def downloadNewCommands = tasks.register('downloadNewCommands', Download) {
7373
overwrite true
7474
}
7575

76+
def downloadRomiVendordep = tasks.register('downloadRomiVendordep', Download) {
77+
src 'https://raw.githubusercontent.com/wpilibsuite/allwpilib/main/romiVendordep/RomiVendordep.json'
78+
dest 'vscode-wpilib/resources/vendordeps/RomiVendordep.json'
79+
overwrite true
80+
}
81+
82+
def downloadXRPVendordep = tasks.register('downloadXRPVendordep', Download) {
83+
src 'https://raw.githubusercontent.com/wpilibsuite/allwpilib/main/xrpVendordep/XRPVendordep.json'
84+
dest 'vscode-wpilib/resources/vendordeps/XRPVendordep.json'
85+
overwrite true
86+
}
87+
7688
task copyFromVsCodeToStandaloneResources(type: Copy) {
7789
dependsOn extractCppDependencies
7890
dependsOn extractJavaDependencies
7991
dependsOn downloadNewCommands
92+
dependsOn downloadRomiVendordep
93+
dependsOn downloadXRPVendordep
8094
from ('vscode-wpilib/resources/java') {
8195
into 'java'
8296
}

vscode-wpilib/resources/gradle/cppxrp/build.gradle

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@ plugins {
88
wpi.sim.addGui().defaultEnabled = true
99
wpi.sim.addDriverstation()
1010

11-
//Sets the websocket client remote host.
12-
wpi.sim.envVar("HALSIMWS_HOST", "192.168.42.1")
13-
wpi.sim.envVar("HALSIMWS_FILTERS", "AIO,DIO,DriverStation,Encoder,Gyro,XRPMotor,XRPServo")
14-
wpi.sim.addWebsocketsServer().defaultEnabled = true
15-
wpi.sim.addWebsocketsClient().defaultEnabled = true
11+
//Sets the XRP Client Host
12+
wpi.sim.envVar("HALSIMXRP_HOST", "192.168.42.1")
13+
wpi.sim.addXRPClient().defaultEnabled = true
1614

1715
model {
1816
components {

vscode-wpilib/resources/gradle/javaxrp/build.gradle

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,9 @@ test {
4141
wpi.sim.addGui().defaultEnabled = true
4242
wpi.sim.addDriverstation()
4343

44-
//Sets the websocket client remote host.
45-
wpi.sim.envVar("HALSIMWS_HOST", "192.168.42.1")
46-
wpi.sim.envVar("HALSIMWS_FILTERS", "AIO,DIO,DriverStation,Encoder,Gyro,XRPMotor,XRPServo")
47-
wpi.sim.addWebsocketsServer().defaultEnabled = true
48-
wpi.sim.addWebsocketsClient().defaultEnabled = true
44+
//Sets the XRP Client Host
45+
wpi.sim.envVar("HALSIMXRP_HOST", "192.168.42.1")
46+
wpi.sim.addXRPClient().defaultEnabled = true
4947

5048
// Setting up my Jar File. In this case, adding all libraries into the main jar ('fat jar')
5149
// in order to make them all available at runtime. Also adding the manifest so WPILib

vscode-wpilib/src/shared/examples.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface IExampleJsonLayout {
1515
foldername: string;
1616
gradlebase: string;
1717
commandversion: number;
18+
extravendordeps?: string[];
1819
}
1920

2021
export class Examples {
@@ -31,6 +32,7 @@ export class Examples {
3132
}
3233
const examples: IExampleJsonLayout[] = jsonc.parse(data) as IExampleJsonLayout[];
3334
for (const e of examples) {
35+
const extraVendordeps: string[] = (e.extravendordeps !== undefined) ? e.extravendordeps : [];
3436
const provider: IExampleTemplateCreator = {
3537
getLanguage(): string {
3638
return java ? 'java' : 'cpp';
@@ -46,13 +48,13 @@ export class Examples {
4648
if (java) {
4749
if (!await generateCopyJava(resourceRoot, path.join(examplesFolder, e.foldername),
4850
path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, 'frc.robot.Main', path.join('frc', 'robot'),
49-
false)) {
51+
false, extraVendordeps)) {
5052
vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder'));
5153
return false;
5254
}
5355
} else {
5456
if (!await generateCopyCpp(resourceRoot, path.join(examplesFolder, e.foldername),
55-
path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, false, false)) {
57+
path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, false, false, extraVendordeps)) {
5658
vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder'));
5759
return false;
5860
}

vscode-wpilib/src/shared/generator.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { setExecutePermissions } from './permissions';
99
type CopyCallback = (srcFolder: string, rootFolder: string) => Promise<boolean>;
1010

1111
export async function generateCopyCpp(resourcesFolder: string, fromTemplateFolder: string | CopyCallback, fromGradleFolder: string, toFolder: string,
12-
addCpp: boolean, directGradleImport: boolean): Promise<boolean> {
12+
addCpp: boolean, directGradleImport: boolean, extraVendordeps: string[]): Promise<boolean> {
1313
try {
1414
const existingFiles = await readdirAsync(toFolder);
1515
if (existingFiles.length > 0) {
@@ -96,6 +96,18 @@ export async function generateCopyCpp(resourcesFolder: string, fromTemplateFolde
9696
const vendorFile = path.join(path.dirname(resourcesFolder), 'vendordeps', commandName);
9797
await copyFileAsync(vendorFile, path.join(vendorDir, commandName));
9898

99+
for (const vendordep of extraVendordeps) {
100+
if (vendordep === 'romi') {
101+
const romiVendordepName = 'RomiVendordep.json';
102+
const romiVendordepFile = path.join(path.dirname(resourcesFolder), 'vendordeps', romiVendordepName);
103+
await copyFileAsync(romiVendordepFile, path.join(vendorDir, romiVendordepName));
104+
} else if (vendordep === 'xrp') {
105+
const xrpVendordepName = 'XRPVendordep.json';
106+
const xrpVendordepFile = path.join(path.dirname(resourcesFolder), 'vendordeps', xrpVendordepName);
107+
await copyFileAsync(xrpVendordepFile, path.join(vendorDir, xrpVendordepName));
108+
}
109+
}
110+
99111
return true;
100112
} catch (e) {
101113
logger.error('Project creation failure', e);
@@ -104,7 +116,7 @@ export async function generateCopyCpp(resourcesFolder: string, fromTemplateFolde
104116
}
105117

106118
export async function generateCopyJava(resourcesFolder: string, fromTemplateFolder: string | CopyCallback, fromGradleFolder: string, toFolder: string,
107-
robotClassTo: string, copyRoot: string, directGradleImport: boolean,
119+
robotClassTo: string, copyRoot: string, directGradleImport: boolean, extraVendordeps: string[],
108120
packageReplaceString?: string | undefined): Promise<boolean> {
109121
try {
110122
const existingFiles = await readdirAsync(toFolder);
@@ -236,6 +248,18 @@ to get a proper path relative to the deploy directory.` ]));
236248
const vendorFile = path.join(path.dirname(resourcesFolder), 'vendordeps', commandName);
237249
await copyFileAsync(vendorFile, path.join(vendorDir, commandName));
238250

251+
for (const vendordep of extraVendordeps) {
252+
if (vendordep === 'romi') {
253+
const romiVendordepName = 'RomiVendordep.json';
254+
const romiVendordepFile = path.join(path.dirname(resourcesFolder), 'vendordeps', romiVendordepName);
255+
await copyFileAsync(romiVendordepFile, path.join(vendorDir, romiVendordepName));
256+
} else if (vendordep === 'xrp') {
257+
const xrpVendordepName = 'XRPVendordep.json';
258+
const xrpVendordepFile = path.join(path.dirname(resourcesFolder), 'vendordeps', xrpVendordepName);
259+
await copyFileAsync(xrpVendordepFile, path.join(vendorDir, xrpVendordepName));
260+
}
261+
}
262+
239263
return true;
240264
} catch (e) {
241265
logger.error('Project creation failure', e);

vscode-wpilib/src/shared/templates.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface ITemplateJsonLayout {
1515
foldername: string;
1616
gradlebase: string;
1717
commandversion: number;
18+
extravendordeps?: string[];
1819
}
1920

2021
export class Templates {
@@ -31,6 +32,7 @@ export class Templates {
3132
}
3233
const templates: ITemplateJsonLayout[] = jsonc.parse(data) as ITemplateJsonLayout[];
3334
for (const e of templates) {
35+
const extraVendordeps: string[] = (e.extravendordeps !== undefined) ? e.extravendordeps : [];
3436
const provider: IExampleTemplateCreator = {
3537
getLanguage(): string {
3638
return java ? 'java' : 'cpp';
@@ -46,13 +48,13 @@ export class Templates {
4648
if (java) {
4749
if (!await generateCopyJava(resourceRoot, path.join(templatesFolder, e.foldername),
4850
path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, 'frc.robot.Main', path.join('frc', 'robot'),
49-
false)) {
51+
false, extraVendordeps)) {
5052
vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder'));
5153
return false;
5254
}
5355
} else {
5456
if (!await generateCopyCpp(resourceRoot, path.join(templatesFolder, e.foldername),
55-
path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, false, false)) {
57+
path.join(gradleBasePath, e.gradlebase), folderInto.fsPath, false, false, extraVendordeps)) {
5658
vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder'));
5759
return false;
5860
}

vscode-wpilib/src/shared/vendorexamples.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ interface IJsonExample {
2121
packagetoreplace?: string | undefined;
2222
dependencies: string[];
2323
foldername: string;
24+
extravendordeps?: string[];
2425
}
2526

2627
// tslint:disable-next-line:no-any
@@ -57,6 +58,7 @@ export async function addVendorExamples(resourceRoot: string, core: IExampleTemp
5758
// Only handle java and cpp
5859
continue;
5960
}
61+
const extraVendordeps: string[] = (ex.extravendordeps !== undefined) ? ex.extravendordeps : [];
6062
const provider: IExampleTemplateCreator = {
6163
getLanguage(): string {
6264
return ex.language;
@@ -72,13 +74,13 @@ export async function addVendorExamples(resourceRoot: string, core: IExampleTemp
7274
if (ex.language === 'java') {
7375
if (!await generateCopyJava(shimmedResourceRoot, path.join(exampleDir, ex.foldername),
7476
path.join(gradleBasePath, ex.gradlebase), folderInto.fsPath, 'frc.robot.' + ex.mainclass,
75-
path.join('frc', 'robot'), false, ex.packagetoreplace)) {
77+
path.join('frc', 'robot'), false, extraVendordeps, ex.packagetoreplace)) {
7678
vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder'));
7779
return false;
7880
}
7981
} else {
8082
if (!await generateCopyCpp(shimmedResourceRoot, path.join(exampleDir, ex.foldername),
81-
path.join(gradleBasePath, ex.gradlebase), folderInto.fsPath, false, false)) {
83+
path.join(gradleBasePath, ex.gradlebase), folderInto.fsPath, false, false, extraVendordeps)) {
8284
vscode.window.showErrorMessage(i18n('message', 'Cannot create into non empty folder'));
8385
return false;
8486
}

vscode-wpilib/src/webviews/gradle2020import.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,11 +249,11 @@ export class Gradle2020Import extends WebViewBase {
249249
if (cpp) {
250250
const gradlePath = path.join(gradleBasePath, data.romi ? 'cppromi' : 'cpp');
251251
success = await generateCopyCpp(path.join(resourceRoot, 'cpp'), path.join(oldProjectPath, 'src'), gradlePath, toFolder,
252-
false, true);
252+
false, true, []);
253253
} else {
254254
const gradlePath = path.join(gradleBasePath, data.romi ? 'javaromi' : 'java');
255255
success = await generateCopyJava(path.join(resourceRoot, 'java'), path.join(oldProjectPath, 'src'), gradlePath, toFolder,
256-
javaRobotPackage, '', true);
256+
javaRobotPackage, '', true, []);
257257
}
258258

259259
if (!success) {

wpilib-utility-standalone/src/generatorscript.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ async function handleCppCreate(_item: IDisplayJSON, _srcRoot: string): Promise<v
211211
const toFolder = dirArr[0];
212212

213213
const templateFolder = path.join(_srcRoot, _item.foldername);
214-
const result = await generateCopyCpp(resourceRoot, templateFolder, path.join(gradleRoot, _item.gradlebase), toFolder, false, false);
214+
const result = await generateCopyCpp(resourceRoot, templateFolder, path.join(gradleRoot, _item.gradlebase), toFolder, false, false, []);
215215
if (!result) {
216216
await dialog.showMessageBox({
217217
message: 'Cannot extract into non empty directory',
@@ -229,7 +229,7 @@ async function handleJavaCreate(_item: IDisplayJSON, _srcRoot: string): Promise<
229229

230230
const templateFolder = path.join(_srcRoot, _item.foldername);
231231
const result = await generateCopyJava(resourceRoot, templateFolder, path.join(gradleRoot, _item.gradlebase), toFolder,
232-
'frc.robot.Robot', path.join('frc', 'robot'), false);
232+
'frc.robot.Robot', path.join('frc', 'robot'), false, []);
233233

234234
if (!result) {
235235
await dialog.showMessageBox({

0 commit comments

Comments
 (0)