RedCrab: Animated LEDs

This commit is contained in:
2024-02-10 12:55:39 -06:00
parent 71374a57ea
commit 3285f540bb
10 changed files with 119 additions and 19 deletions

View File

@@ -92,7 +92,12 @@ public class RedCrabMinibot {
public final DigitalChannel ledTopGreen, ledTopRed, ledRail0Green, ledRail0Red, ledRail1Green, ledRail1Red, ledRail2Green, ledRail2Red,
ledRail3Green, ledRail3Red;
public final ArrayList<DigitalChannel> railGreenLEDs = new ArrayList<>(), railRedLEDs = new ArrayList<>();
public final boolean LED_OFF = true, LED_ON = false;
public int ledChaserIndex = 0;
public final long ledChaserIntervalMS;
public long lastLedChaserTimeMS;
public final boolean LED_OFF = true;
public final boolean LED_ON = false;
public boolean ledChaseUp = true;
final CyberarmEngine engine;
public final boolean autonomous;
@@ -299,6 +304,9 @@ public class RedCrabMinibot {
led.setState(LED_ON);
}
ledChaserIntervalMS = 250;
lastLedChaserTimeMS = System.currentTimeMillis();
// Bulk read from hubs
Utilities.hubsBulkReadMode(engine.hardwareMap, LynxModule.BulkCachingMode.MANUAL);
@@ -625,20 +633,22 @@ public class RedCrabMinibot {
ledTopRed.setState(LED_OFF);
ledTopGreen.setState(LED_ON);
ledSetRailRedLEDs(LED_OFF);
ledSetRailGreenLEDs(LED_ON);
} else if (engine.runTime() < 25_000.0) { // RUNNING LOW ON TIME
ledTopRed.setState(LED_ON);
ledAnimateChaser(LED_OFF, LED_ON, false);
} else if (engine.runTime() < 23_000.0) { // RUNNING LOW ON TIME
ledTopRed.setState(LED_OFF);
ledTopGreen.setState(LED_ON);
ledSetRailRedLEDs(LED_ON);
ledSetRailGreenLEDs(LED_ON);
ledAnimateChaser(LED_ON, LED_ON, false);
} else { // 5 SECONDS LEFT!
ledTopRed.setState(LED_ON);
ledTopGreen.setState(LED_OFF);
if (engine.runTime() < 29_000.0) {
ledTopRed.setState(LED_ON);
ledTopGreen.setState(LED_ON);
} else {
ledTopRed.setState(LED_ON);
ledTopGreen.setState(LED_OFF);
}
ledSetRailRedLEDs(LED_ON);
ledSetRailGreenLEDs(LED_OFF);
ledAnimateProgress(LED_ON, LED_OFF, (engine.runTime() - 23_000.0) / 5_000.0);
}
} else {
if (engine.runTime() >= 90_000.0) { // LAUNCH DRONE and DO CHIN UP
@@ -648,17 +658,20 @@ public class RedCrabMinibot {
ledSetRailRedLEDs(LED_OFF);
ledSetRailGreenLEDs(LED_ON);
} else if (engine.runTime() >= 80_000.0) { // GET READY
ledTopRed.setState(LED_ON);
ledTopGreen.setState(LED_ON);
if (ledChaserIndex == railRedLEDs.size() - 1) {
ledTopRed.setState(LED_OFF);
ledTopGreen.setState(LED_OFF);
} else {
ledTopRed.setState(LED_ON);
ledTopGreen.setState(LED_ON);
}
ledSetRailRedLEDs(LED_ON);
ledSetRailGreenLEDs(LED_ON);
ledAnimateChaser(LED_ON, LED_ON, false);
} else { // KEEP CALM and CARRY ON
ledTopRed.setState(LED_ON);
ledTopGreen.setState(LED_OFF);
ledSetRailRedLEDs(LED_ON);
ledSetRailGreenLEDs(LED_OFF);
ledAnimateChaser(LED_ON, LED_OFF, false);
}
}
}
@@ -674,4 +687,70 @@ public class RedCrabMinibot {
led.setState(ledState);
}
}
public void ledAnimateChaser(boolean ledRed, boolean ledGreen, boolean invert) {
if (System.currentTimeMillis() - lastLedChaserTimeMS >= ledChaserIntervalMS) {
lastLedChaserTimeMS = System.currentTimeMillis();
} else {
return;
}
// Turn off current LED
if (invert) {
railRedLEDs.get(ledChaserIndex).setState(ledRed);
railGreenLEDs.get(ledChaserIndex).setState(ledGreen);
} else {
railRedLEDs.get(ledChaserIndex).setState(LED_OFF);
railGreenLEDs.get(ledChaserIndex).setState(LED_OFF);
}
// Cycle up/down
if (ledChaseUp) {
ledChaserIndex++;
} else {
ledChaserIndex--;
}
// Switch active LED
if (ledChaserIndex >= railRedLEDs.size()) {
ledChaseUp = !ledChaseUp;
ledChaserIndex = railRedLEDs.size() - 2;
} else if (ledChaserIndex < 0) {
ledChaseUp = !ledChaseUp;
ledChaserIndex = 1;
}
// Control active LED
if (!invert) {
railRedLEDs.get(ledChaserIndex).setState(ledRed);
railGreenLEDs.get(ledChaserIndex).setState(ledGreen);
} else {
railRedLEDs.get(ledChaserIndex).setState(LED_OFF);
railGreenLEDs.get(ledChaserIndex).setState(LED_OFF);
}
}
public void ledAnimateProgress(boolean progressLEDsRed, boolean progressLEDsGreen, double ratio) {
double i = 0.0;
for (DigitalChannel led : railRedLEDs) {
i += 1.0 / railRedLEDs.size();
if (ratio < i) {
led.setState(LED_OFF);
} else {
led.setState(progressLEDsRed);
}
}
i = 0.0;
for (DigitalChannel led : railGreenLEDs) {
i += 1.0 / railGreenLEDs.size();
if (ratio < i) {
led.setState(LED_OFF);
} else {
led.setState(progressLEDsGreen);
}
}
}
}

View File

@@ -0,0 +1,16 @@
package dev.cyberarm.minibots.red_crab.engines;
import dev.cyberarm.engine.V2.CyberarmState;
import dev.cyberarm.minibots.red_crab.RedCrabMinibot;
public class LEDControllerTask extends CyberarmState {
private final RedCrabMinibot robot;
public LEDControllerTask(RedCrabMinibot robot) {
this.robot = robot;
}
@Override
public void exec() {
robot.ledController();
}
}

View File

@@ -14,6 +14,7 @@ public class RedCrabAutonomousBlueAudienceEngine extends RedCrabEngine {
public void setup() {
robot = new RedCrabMinibot(true);
addTask(new ClawArmTask(robot));
addTask(new LEDControllerTask(robot));
addTask(new LocalizerTask(robot));
setupFromConfig(

View File

@@ -14,6 +14,7 @@ public class RedCrabAutonomousBlueBackstageEngine extends RedCrabEngine {
public void setup() {
robot = new RedCrabMinibot(true);
addTask(new ClawArmTask(robot));
addTask(new LEDControllerTask(robot));
addTask(new LocalizerTask(robot));
setupFromConfig(

View File

@@ -14,6 +14,7 @@ public class RedCrabAutonomousDebuggingOnlyEngine extends RedCrabEngine {
public void setup() {
robot = new RedCrabMinibot(true);
addTask(new ClawArmTask(robot));
addTask(new LEDControllerTask(robot));
addTask(new LocalizerTask(robot));
setupFromConfig(

View File

@@ -14,6 +14,7 @@ public class RedCrabAutonomousRedAudienceEngine extends RedCrabEngine {
public void setup() {
robot = new RedCrabMinibot(true);
addTask(new ClawArmTask(robot));
addTask(new LEDControllerTask(robot));
addTask(new LocalizerTask(robot));
setupFromConfig(

View File

@@ -14,6 +14,7 @@ public class RedCrabAutonomousRedBackstageEngine extends RedCrabEngine {
public void setup() {
robot = new RedCrabMinibot(true);
addTask(new ClawArmTask(robot));
addTask(new LEDControllerTask(robot));
addTask(new LocalizerTask(robot));
setupFromConfig(

View File

@@ -14,8 +14,6 @@ public abstract class RedCrabEngine extends CyberarmEngine {
super.loop();
robot.standardTelemetry();
robot.ledController();
}
@Override

View File

@@ -18,6 +18,7 @@ public class RedCrabTeleOpDebuggingOnlyEngine extends RedCrabEngine {
robot = new RedCrabMinibot(false);
addTask(new LEDControllerTask(robot));
addTask(new LocalizerTask(robot));
addState(new CyberarmState() {

View File

@@ -16,6 +16,7 @@ public class RedCrabTeleOpEngine extends RedCrabEngine {
robot = new RedCrabMinibot(false);
addTask(new ClawArmTask(robot));
addTask(new LEDControllerTask(robot));
addTask(new LocalizerTask(robot));
addState(new Pilot(robot));