diff --git a/build.gradle b/build.gradle index 24a2d9c0..94c1cb9b 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 6398e9fc..94135618 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 0d99de9c..249b321e 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 00000000..fa08705a --- /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