[wpilibj] AddressableLEDBuffer: Add methods for reading individual RGB values (#6333)

This avoids the allocation/GC overhead of returning a Color8 value.

Also add an indexed iterator forEach to loop over the entire buffer.
This commit is contained in:
Sam Carlberg
2024-02-01 17:01:53 -05:00
committed by GitHub
parent 90bb6cfffa
commit d4533a8900
2 changed files with 136 additions and 6 deletions

View File

@@ -6,6 +6,7 @@ package edu.wpi.first.wpilibj;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
import static org.junit.jupiter.params.provider.Arguments.arguments;
import edu.wpi.first.wpilibj.util.Color;
@@ -70,4 +71,73 @@ class AddressableLEDBufferTest {
assertEquals(firstRedColor8Bit, buffer.getLED8Bit(2));
assertEquals(firstBlueColor8Bit, buffer.getLED8Bit(3));
}
@Test
void getRed() {
var buffer = new AddressableLEDBuffer(1);
buffer.setRGB(0, 127, 128, 129);
assertEquals(127, buffer.getRed(0));
}
@Test
void getGreen() {
var buffer = new AddressableLEDBuffer(1);
buffer.setRGB(0, 127, 128, 129);
assertEquals(128, buffer.getGreen(0));
}
@Test
void getBlue() {
var buffer = new AddressableLEDBuffer(1);
buffer.setRGB(0, 127, 128, 129);
assertEquals(129, buffer.getBlue(0));
}
@Test
void forEach() {
var buffer = new AddressableLEDBuffer(3);
buffer.setRGB(0, 1, 2, 3);
buffer.setRGB(1, 4, 5, 6);
buffer.setRGB(2, 7, 8, 9);
buffer.forEach(
(index, r, g, b) -> {
switch (index) {
case 0:
{
assertAll(
() -> assertEquals(1, r, "red at index 0"),
() -> assertEquals(2, g, "green at index 0"),
() -> assertEquals(3, b, "blue at index 0"));
}
break;
case 1:
{
assertAll(
() -> assertEquals(4, r, "red at index 1"),
() -> assertEquals(5, g, "green at index 1"),
() -> assertEquals(6, b, "blue at index 1"));
}
break;
case 2:
{
assertAll(
() -> assertEquals(7, r, "red at index 2"),
() -> assertEquals(8, g, "green at index 2"),
() -> assertEquals(9, b, "blue at index 2"));
}
break;
default:
fail("Unexpected index " + index);
break;
}
});
}
@Test
void forEachOnEmptyBuffer() {
var buffer = new AddressableLEDBuffer(0);
buffer.forEach((i, r, g, b) -> fail("Iterator should not be called on an empty buffer"));
}
}