diff --git a/TeamCode/src/main/java/dev/cyberarm/engine/V2/CyberarmEngine.java b/TeamCode/src/main/java/dev/cyberarm/engine/V2/CyberarmEngine.java index b5ef54a..1837c0a 100644 --- a/TeamCode/src/main/java/dev/cyberarm/engine/V2/CyberarmEngine.java +++ b/TeamCode/src/main/java/dev/cyberarm/engine/V2/CyberarmEngine.java @@ -113,6 +113,14 @@ public abstract class CyberarmEngine extends OpMode { return; } + if (!useThreads) { + threadlessExecState(state); + + for (CyberarmState task : backgroundTasks) { + threadlessExecState(task); + } + } + // Add telemetry to show currently running state telemetry.addLine( "Running state: " +state.getClass().getSimpleName() + ". State: " + @@ -213,18 +221,36 @@ public abstract class CyberarmEngine extends OpMode { final CyberarmState finalState = state; // if (state.isRunning()) { return; } // Assume that we have already started running this state - new Thread(() -> { + if (useThreads) { + new Thread(() -> { + finalState.prestart(); + finalState.start(); + finalState.startTime = System.currentTimeMillis(); + finalState.run(); + }).start(); + } else { finalState.prestart(); finalState.start(); finalState.startTime = System.currentTimeMillis(); - finalState.run(); - }).start(); + } for (CyberarmState kid : state.children) { runState(kid); } } + /** + * Recursively exec states + * @param state State to exec + */ + private void threadlessExecState(final CyberarmState state) { + state.exec(); + + for (CyberarmState kid : state.children) { + threadlessExecState(kid); + } + } + /** * Add state to queue, will call init() on state if engine is running * @param state State to add to queue @@ -485,7 +511,7 @@ public abstract class CyberarmEngine extends OpMode { } /** - * NO OP + * Disable running states in their own threads which might help with random crashes. */ public void threadless() { useThreads = false; diff --git a/TeamCode/src/main/java/dev/cyberarm/engine/V2/CyberarmState.java b/TeamCode/src/main/java/dev/cyberarm/engine/V2/CyberarmState.java index ed83fdc..55b4b8b 100644 --- a/TeamCode/src/main/java/dev/cyberarm/engine/V2/CyberarmState.java +++ b/TeamCode/src/main/java/dev/cyberarm/engine/V2/CyberarmState.java @@ -45,6 +45,7 @@ public abstract class CyberarmState implements Runnable { /** * State's main loop, calls exec() until hasFinished is true * DO NO OVERRIDE + * blocking */ @Override public void run() { @@ -162,6 +163,7 @@ public abstract class CyberarmState implements Runnable { */ public void setHasFinished(boolean value) { hasFinished = value; + isRunning = value; // Dubious? } /** @@ -177,6 +179,7 @@ public abstract class CyberarmState implements Runnable { */ public void finished() { hasFinished = true; + isRunning = false; } /**