From aceb6242c41925241f980d14fbef40fd601e5fa5 Mon Sep 17 00:00:00 2001 From: dejabot <104333734+dejabot@users.noreply.github.com> Date: Mon, 15 Jan 2024 14:18:33 -0800 Subject: [PATCH 1/2] First pass at integrating AdvantageKit into MaroonFramework (#34) * basic installation and integration of AdvantageKit * also log MF logs to WPI data logs * brace yourself for lint checks * log joystick input via DriverStation * removing Logger line that looks like a bug. * Fixed issue with logging on the simulator * address PR comments * fix merge conflicts * change how we enable dual logging * also dual-log for Logger.logRaw() --------- Co-authored-by: ThatComposerDude <112048494+ThatComposerDude@users.noreply.github.com> --- build.gradle | 16 ++++++++ .../com/team766/hal/wpilib/RobotMain.java | 30 +++++++++++++- src/main/java/com/team766/logging/Logger.java | 18 +++++++- vendordeps/AdvantageKit.json | 41 +++++++++++++++++++ 4 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 vendordeps/AdvantageKit.json diff --git a/build.gradle b/build.gradle index 24a2d9c07..94c1cb9b3 100644 --- a/build.gradle +++ b/build.gradle @@ -179,6 +179,22 @@ allprojects { // REV maven { url = uri('https://maven.revrobotics.com/') } + + // AdvantageKit + // we're using the credentials documented at + // https://github.com/Mechanical-Advantage/AdvantageKit/blob/main/docs/INSTALLATION.md + maven { + url = uri("https://maven.pkg.github.com/Mechanical-Advantage/AdvantageKit") + credentials { + username = "Mechanical-Advantage-Bot" + password = "\u0067\u0068\u0070\u005f\u006e\u0056\u0051\u006a\u0055\u004f\u004c\u0061\u0079\u0066\u006e\u0078\u006e\u0037\u0051\u0049\u0054\u0042\u0032\u004c\u004a\u006d\u0055\u0070\u0073\u0031\u006d\u0037\u004c\u005a\u0030\u0076\u0062\u0070\u0063\u0051" + } + } + } + + //AdvantageKit code + configurations.all { + exclude group: "edu.wpi.first.wpilibj" } } diff --git a/src/main/java/com/team766/hal/wpilib/RobotMain.java b/src/main/java/com/team766/hal/wpilib/RobotMain.java index 6398e9fc7..94135618d 100755 --- a/src/main/java/com/team766/hal/wpilib/RobotMain.java +++ b/src/main/java/com/team766/hal/wpilib/RobotMain.java @@ -5,15 +5,22 @@ import com.team766.hal.GenericRobotMain; import com.team766.hal.RobotProvider; import com.team766.logging.LoggerExceptionUtils; +import edu.wpi.first.wpilibj.DataLogManager; +import edu.wpi.first.wpilibj.DriverStation; import edu.wpi.first.wpilibj.Filesystem; +import edu.wpi.first.wpilibj.PowerDistribution; +import edu.wpi.first.wpilibj.PowerDistribution.ModuleType; import edu.wpi.first.wpilibj.RobotBase; -import edu.wpi.first.wpilibj.TimedRobot; import java.io.File; // import java.nio.file.Files; import java.nio.file.Path; import java.util.function.Supplier; +import org.littletonrobotics.junction.LoggedRobot; +import org.littletonrobotics.junction.Logger; +import org.littletonrobotics.junction.networktables.NT4Publisher; +import org.littletonrobotics.junction.wpilog.WPILOGWriter; -public class RobotMain extends TimedRobot { +public class RobotMain extends LoggedRobot { // this file, if present, will be a symlink to one of several config files in the deploy // directory. // this allows for the same code to be deployed to multiple physical robots, each with their own @@ -95,6 +102,25 @@ public void robotInit() { RobotProvider.instance = new WPIRobotProvider(); robot = new GenericRobotMain(); + DriverStation.startDataLog(DataLogManager.getLog()); + + if (isReal()) { + // enable dual-logging + com.team766.logging.Logger.enableLoggingToDataLog(true); + + // set up AdvantageKit logging + DataLogManager.log("Initializing logging."); + Logger.getInstance().addDataReceiver(new WPILOGWriter("/U/logs")); // Log to sdcard + Logger.getInstance() + .addDataReceiver(new NT4Publisher()); // Publish data to NetworkTables + new PowerDistribution(1, ModuleType.kRev); // Enables power distribution logging + + } else { + // TODO: add support for simulation logging/replay + } + + Logger.getInstance().start(); + robot.robotInit(); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/com/team766/logging/Logger.java b/src/main/java/com/team766/logging/Logger.java index 0d99de9c7..249b321e6 100644 --- a/src/main/java/com/team766/logging/Logger.java +++ b/src/main/java/com/team766/logging/Logger.java @@ -2,6 +2,7 @@ import com.team766.config.ConfigFileReader; import com.team766.library.CircularBuffer; +import edu.wpi.first.wpilibj.DataLogManager; import java.io.File; import java.text.SimpleDateFormat; import java.util.Collection; @@ -10,6 +11,9 @@ import java.util.EnumMap; public final class Logger { + + private static boolean alsoLogToDataLog = false; + private static class LogUncaughtException implements Thread.UncaughtExceptionHandler { public void uncaughtException(final Thread t, final Throwable e) { e.printStackTrace(); @@ -68,6 +72,10 @@ public void uncaughtException(final Thread t, final Throwable e) { Thread.setDefaultUncaughtExceptionHandler(new LogUncaughtException()); } + public static void enableLoggingToDataLog(boolean enabled) { + alsoLogToDataLog = enabled; + } + public static Logger get(final Category category) { return m_loggers.get(category); } @@ -100,9 +108,11 @@ public void logData(final Severity severity, final String format, final Object.. .setTime(getTime()) .setSeverity(severity) .setCategory(m_category); - entry.setMessageStr(String.format(format, args)); + String message = String.format(format, args); + entry.setMessageStr(message); m_recentEntries.add(entry.build()); entry.setMessageStr(format); + for (Object arg : args) { var logValue = LogValue.newBuilder(); SerializationUtils.valueToProto(arg, logValue); @@ -111,6 +121,9 @@ public void logData(final Severity severity, final String format, final Object.. if (m_logWriter != null) { m_logWriter.logStoredFormat(entry); } + if (alsoLogToDataLog) { + DataLogManager.log(message); + } } public void logRaw(final Severity severity, final String message) { @@ -125,6 +138,9 @@ public void logRaw(final Severity severity, final String message) { if (m_logWriter != null) { m_logWriter.log(entry); } + if (alsoLogToDataLog) { + DataLogManager.log(message); + } } void logOnlyInMemory(final Severity severity, final String message) { diff --git a/vendordeps/AdvantageKit.json b/vendordeps/AdvantageKit.json new file mode 100644 index 000000000..fa08705ae --- /dev/null +++ b/vendordeps/AdvantageKit.json @@ -0,0 +1,41 @@ +{ + "fileName": "AdvantageKit.json", + "name": "AdvantageKit", + "version": "2.2.4", + "uuid": "d820cc26-74e3-11ec-90d6-0242ac120003", + "mavenUrls": [], + "jsonUrl": "https://github.com/Mechanical-Advantage/AdvantageKit/releases/latest/download/AdvantageKit.json", + "javaDependencies": [ + { + "groupId": "org.littletonrobotics.akit.junction", + "artifactId": "wpilib-shim", + "version": "2.2.4" + }, + { + "groupId": "org.littletonrobotics.akit.junction", + "artifactId": "junction-core", + "version": "2.2.4" + }, + { + "groupId": "org.littletonrobotics.akit.conduit", + "artifactId": "conduit-api", + "version": "2.2.4" + } + ], + "jniDependencies": [ + { + "groupId": "org.littletonrobotics.akit.conduit", + "artifactId": "conduit-wpilibio", + "version": "2.2.4", + "skipInvalidPlatforms": false, + "isJar": false, + "validPlatforms": [ + "linuxathena", + "windowsx86-64", + "linuxx86-64", + "osxuniversal" + ] + } + ], + "cppDependencies": [] +} \ No newline at end of file From 4c3870a962d7d3ab116389af7b40aaf99ae59286 Mon Sep 17 00:00:00 2001 From: Debajit Ghosh Date: Mon, 15 Jan 2024 14:29:13 -0800 Subject: [PATCH 2/2] merge advantagekit integration into 2024 also update to latest advantagekit --- src/main/java/com/team766/hal/wpilib/RobotMain.java | 7 +++---- vendordeps/AdvantageKit.json | 11 ++++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/team766/hal/wpilib/RobotMain.java b/src/main/java/com/team766/hal/wpilib/RobotMain.java index 94135618d..77530bc1f 100755 --- a/src/main/java/com/team766/hal/wpilib/RobotMain.java +++ b/src/main/java/com/team766/hal/wpilib/RobotMain.java @@ -110,16 +110,15 @@ public void robotInit() { // set up AdvantageKit logging DataLogManager.log("Initializing logging."); - Logger.getInstance().addDataReceiver(new WPILOGWriter("/U/logs")); // Log to sdcard - Logger.getInstance() - .addDataReceiver(new NT4Publisher()); // Publish data to NetworkTables + Logger.addDataReceiver(new WPILOGWriter("/U/logs")); // Log to sdcard + Logger.addDataReceiver(new NT4Publisher()); // Publish data to NetworkTables new PowerDistribution(1, ModuleType.kRev); // Enables power distribution logging } else { // TODO: add support for simulation logging/replay } - Logger.getInstance().start(); + Logger.start(); robot.robotInit(); } catch (Exception e) { diff --git a/vendordeps/AdvantageKit.json b/vendordeps/AdvantageKit.json index fa08705ae..cca06ae6a 100644 --- a/vendordeps/AdvantageKit.json +++ b/vendordeps/AdvantageKit.json @@ -1,32 +1,33 @@ { "fileName": "AdvantageKit.json", "name": "AdvantageKit", - "version": "2.2.4", + "version": "3.0.0", "uuid": "d820cc26-74e3-11ec-90d6-0242ac120003", + "frcYear": "2024", "mavenUrls": [], "jsonUrl": "https://github.com/Mechanical-Advantage/AdvantageKit/releases/latest/download/AdvantageKit.json", "javaDependencies": [ { "groupId": "org.littletonrobotics.akit.junction", "artifactId": "wpilib-shim", - "version": "2.2.4" + "version": "3.0.0" }, { "groupId": "org.littletonrobotics.akit.junction", "artifactId": "junction-core", - "version": "2.2.4" + "version": "3.0.0" }, { "groupId": "org.littletonrobotics.akit.conduit", "artifactId": "conduit-api", - "version": "2.2.4" + "version": "3.0.0" } ], "jniDependencies": [ { "groupId": "org.littletonrobotics.akit.conduit", "artifactId": "conduit-wpilibio", - "version": "2.2.4", + "version": "3.0.0", "skipInvalidPlatforms": false, "isJar": false, "validPlatforms": [