diff --git a/src/main/java/edu/wpi/first/wpilibj/DriverStation.java b/src/main/java/edu/wpi/first/wpilibj/DriverStation.java index 41443a1..5ac519a 100644 --- a/src/main/java/edu/wpi/first/wpilibj/DriverStation.java +++ b/src/main/java/edu/wpi/first/wpilibj/DriverStation.java @@ -584,9 +584,7 @@ public class DriverStation { logRecord.setThrown(throwable); }); if (!frc4388.utility.AnsiLogging.halLoggerHandler.isLoggable(logRecord)) return; - // java.util.logging.Logger.getLogger(HAL.class.getSimpleName()).log(logRecord); - String msg = frc4388.utility.AnsiLogging.halLoggerHandler.getFormatter().format(logRecord); - HAL.sendError(isError, code, false, msg.substring(0, msg.length() - 1), "", "", true); + frc4388.utility.AnsiLogging.halLoggerHandler.publish(logRecord); } else { String locString; if (stackTrace.length >= stackTraceFirst + 1) { diff --git a/src/main/java/frc4388/utility/AnsiLogging.java b/src/main/java/frc4388/utility/AnsiLogging.java index 68673ca..5da9a74 100644 --- a/src/main/java/frc4388/utility/AnsiLogging.java +++ b/src/main/java/frc4388/utility/AnsiLogging.java @@ -4,9 +4,11 @@ import static org.fusesource.jansi.Ansi.ansi; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; +import java.nio.charset.StandardCharsets; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Map; @@ -25,6 +27,9 @@ import com.diffplug.common.base.Errors; import org.fusesource.jansi.Ansi.Attribute; import org.fusesource.jansi.Ansi.Color; + +import edu.wpi.first.hal.HAL; + import org.fusesource.jansi.AnsiConsole; import org.fusesource.jansi.AnsiPrintStream; @@ -56,7 +61,7 @@ public class AnsiLogging { // This is registering a plugin that will log Durian errors to the console using a logger. DurianPlugins.register(Errors.Plugins.Log.class, e -> Logger.getLogger(e.getStackTrace()[0].getClassName().substring(e.getStackTrace()[0].getClassName().lastIndexOf('.') + 1)).log(Level.SEVERE, e, e::getLocalizedMessage)); // Store the handler for HAL to use when sending errors to DriverStation. - halLoggerHandler = new LoggingAnsiConsoleHandler(); + halLoggerHandler = new LoggingAnsiConsoleHandler(new HalOutputStream()); } catch (IOException exception) { exception.printStackTrace(AnsiConsole.sysErr()); } @@ -70,6 +75,10 @@ public class AnsiLogging { super(ANSI_CONSOLE_STREAM, new LoggingAnsiFormatter()); setLevel(LEVEL); } + public LoggingAnsiConsoleHandler(OutputStream out) { + super(out, new LoggingAnsiFormatter()); + setLevel(LEVEL); + } private static class LoggingAnsiFormatter extends Formatter { private static final ZoneId ZONE_ID = ZoneId.systemDefault(); @@ -129,4 +138,18 @@ public class AnsiLogging { } }, true); } + + private static class HalOutputStream extends ByteArrayOutputStream { + @Override + public synchronized void write(int b) { + if (b == '\n') flush(); + else super.write(b); + } + @Override + public void flush() { + String s = toString(); + HAL.sendError(false, 0, false, s.substring(0, s.length() - 1), "", "", true); + reset(); + } + } } \ No newline at end of file