Skip to content

Commit 54c15c3

Browse files
authored
Add custom frc kill script to work around jvm bug (#699)
1 parent 84bffed commit 54c15c3

File tree

6 files changed

+96
-10
lines changed

6 files changed

+96
-10
lines changed

src/main/java/edu/wpi/first/gradlerio/GradleRIOPlugin.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import edu.wpi.first.gradlerio.deploy.FRCDeployPlugin;
4545
import edu.wpi.first.gradlerio.deploy.roborio.RoboRIO;
4646
import edu.wpi.first.gradlerio.wpi.WPIPlugin;
47-
import edu.wpi.first.gradlerio.OneDriveException;
4847

4948
public abstract class GradleRIOPlugin implements Plugin<Project> {
5049

src/main/java/edu/wpi/first/gradlerio/deploy/StagedDeployTarget.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public StagedDeployTarget(String name, Project project, DeployExtension de) {
5353

5454
private void configureArtifact(Artifact artifact) {
5555
Callable<TaskProvider<StageDeployTask>> cbl = () -> computeArtifactStageDep(artifact);
56-
artifact.dependsOn(cbl);
56+
artifact.dependsOnForDeployTask(cbl);
5757
}
5858

5959
private final DeployStage defaultStage = DeployStage.FileDeploy;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package edu.wpi.first.gradlerio.deploy.roborio;
2+
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
6+
import javax.inject.Inject;
7+
8+
import edu.wpi.first.deployutils.deploy.artifact.AbstractArtifact;
9+
import edu.wpi.first.deployutils.deploy.context.DeployContext;
10+
import edu.wpi.first.gradlerio.deploy.DeployStage;
11+
import edu.wpi.first.gradlerio.deploy.StagedDeployTarget;
12+
import edu.wpi.first.gradlerio.wpi.dependencies.tools.ToolInstallTask;
13+
14+
public class FRCProgramKillArtifact extends AbstractArtifact {
15+
16+
@Inject
17+
public FRCProgramKillArtifact(String name, StagedDeployTarget target) {
18+
super(name, target);
19+
20+
target.setDeployStage(this, DeployStage.ProgramKill);
21+
22+
23+
}
24+
25+
@Override
26+
public void deploy(DeployContext ctx) {
27+
ctx.getLogger().log(" Deploying new frcKillRobot script");
28+
try (InputStream it = ToolInstallTask.class.getResourceAsStream("/frcKillRobot.sh")) {
29+
ctx.put(it, "/usr/local/frc/bin/frcKillRobot.sh.tmp");
30+
} catch (IOException e) {
31+
throw new RuntimeException(e);
32+
}
33+
ctx.execute("mv /usr/local/frc/bin/frcKillRobot.sh.tmp /usr/local/frc/bin/frcKillRobot.sh && chmod +x /usr/local/frc/bin/frcKillRobot.sh");
34+
ctx.execute("sync");
35+
ctx.execute(". /etc/profile.d/natinst-path.sh; /usr/local/frc/bin/frcKillRobot.sh -t -r 2> /dev/null");
36+
}
37+
}

src/main/java/edu/wpi/first/gradlerio/deploy/roborio/RoboRIO.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@
1212
import org.gradle.api.logging.Logging;
1313

1414
import edu.wpi.first.deployutils.deploy.DeployExtension;
15-
import edu.wpi.first.deployutils.deploy.artifact.MultiCommandArtifact;
1615
import edu.wpi.first.deployutils.deploy.context.DeployContext;
1716
import edu.wpi.first.deployutils.deploy.target.location.SshDeployLocation;
18-
import edu.wpi.first.gradlerio.deploy.DeployStage;
1917
import edu.wpi.first.gradlerio.deploy.FRCExtension;
2018
import edu.wpi.first.gradlerio.deploy.WPIRemoteTarget;
2119
import edu.wpi.first.gradlerio.wpi.WPIExtension;
@@ -28,7 +26,7 @@ public class RoboRIO extends WPIRemoteTarget {
2826
private boolean checkImage = true;
2927
private final List<String> validImageVersions;
3028

31-
private final MultiCommandArtifact programKillArtifact;
29+
private final FRCProgramKillArtifact programKillArtifact;
3230

3331
@Inject
3432
public RoboRIO(String name, Project project, DeployExtension de, FRCExtension frcExtension) {
@@ -44,16 +42,14 @@ public RoboRIO(String name, Project project, DeployExtension de, FRCExtension fr
4442
// Make a copy of valid image versions so user defined cannot modify the global array
4543
validImageVersions = new ArrayList<>(WPIExtension.getValidImageVersions());
4644

47-
programKillArtifact = project.getObjects().newInstance(MultiCommandArtifact.class, "programKill" + name, this);
48-
setDeployStage(programKillArtifact, DeployStage.ProgramKill);
49-
programKillArtifact.addCommand("kill", ". /etc/profile.d/natinst-path.sh; /usr/local/frc/bin/frcKillRobot.sh -t 2> /dev/null");
45+
programKillArtifact = project.getObjects().newInstance(FRCProgramKillArtifact.class, "programKill" + name, this);
5046

5147
getTargetPlatform().set(NativePlatforms.roborio);
5248

5349
getArtifacts().add(programKillArtifact);
5450
}
5551

56-
public MultiCommandArtifact getProgramKillArtifact() {
52+
public FRCProgramKillArtifact getProgramKillArtifact() {
5753
return programKillArtifact;
5854
}
5955

src/main/java/edu/wpi/first/gradlerio/wpi/cpp/WPINativeCompileRules.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void execute(Task arg0) {
8383
// From
8484
// https://github.com/wpilibsuite/native-utils/blob/a8ea595670716c7b898878a37e36c2b52e8e3f42/src/main/groovy/edu/wpi/first/nativeutils/rules/BuildConfigRules.groovy#L450
8585
private static void printWarningsForBinTask(String taskName, Project project) {
86-
File file = new File(project.getBuildDir(), "tmp/" + taskName + "/output.txt");
86+
File file = project.getLayout().getBuildDirectory().get().file("/tmp/" + taskName + "/output.txt").getAsFile();
8787

8888
if (!file.exists())
8989
return;

src/main/resources/frcKillRobot.sh

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
FRC_PID_FILE=/var/run/natinst/FRC_UserProgram.pid
2+
3+
usage()
4+
{
5+
cat >&2 <<EOF
6+
Usage: ${0##*/} [-r] [-t]
7+
8+
-r Restart the lvrt process
9+
-t Configure lvrt to start a text-based program
10+
11+
EOF
12+
exit 1
13+
}
14+
15+
while getopts "rt" Option
16+
do
17+
case $Option in
18+
r) RESTART=yes;;
19+
t) TEXT_BASED_PROGRAM=yes;;
20+
*) usage;;
21+
esac
22+
done
23+
24+
25+
if [ "$TEXT_BASED_PROGRAM" = yes ]; then
26+
/usr/local/frc/bin/frcEnableTBLStartupApp.sh
27+
if [ "$RESTART" = yes ]; then
28+
nirtcfg --file /etc/natinst/share/lvrt.conf --set section=LVRT,token=RTTarget.LaunchAppAtBoot,value=True
29+
else
30+
nirtcfg --file /etc/natinst/share/lvrt.conf --set section=LVRT,token=RTTarget.LaunchAppAtBoot,value=False
31+
fi
32+
fi
33+
34+
printf "%s - Killing robot code in frcKillRobot.sh\n" "`date`" | FRC_ConsoleTee
35+
36+
if [ -e $FRC_PID_FILE ]; then
37+
DAEMON_PID=`cat $FRC_PID_FILE`
38+
if [ -e /proc/$DAEMON_PID ]; then
39+
PGROUP=`ps -o pid,pgid,comm | grep $DAEMON_PID | awk -v N=2 '{print $N}'`
40+
kill -term -- -$PGROUP
41+
sleep 1
42+
kill -9 -- -$PGROUP
43+
fi
44+
rm -f $FRC_PID_FILE
45+
fi
46+
47+
if [ "$RESTART" = yes ]; then
48+
RT_STARTUP_DISABLED=`nirtcfg --get section=SYSTEMSETTINGS,token=NoApp.enabled,value=false | tr "[:upper:]" "[:lower:]"`
49+
if [ "$RT_STARTUP_DISABLED" = false ]; then
50+
killall lvrt
51+
else
52+
/usr/local/frc/bin/frcRunRobot.sh &
53+
fi
54+
fi

0 commit comments

Comments
 (0)