Pasteurized
Usage
The basics:
// Pasteurized offers advanced versions of the gamepads
Pasteurized.gamepad1();
Pasteurized.gamepad2();
// buttons on the gamepads are represented by EnhancedBooleanSuppliers
EnhancedBooleanSupplier enhancedBooleanSupplier = Pasteurized.gamepad1().a();
enhancedBooleanSupplier.state(); // current state
enhancedBooleanSupplier.onTrue(); // a rising edge detector
enhancedBooleanSupplier.onFalse(); // a falling edge detector
enhancedBooleanSupplier.toggleTrue(); // a toggle that gets changed whenever a rising edge is detected
enhancedBooleanSupplier.toggleFalse(); // a toggle that gets changed whenever a falling edge is detected
// sticks and triggers are represented via EnhancedNumberSuppliers
EnhancedDoubleSupplier enhancedNumberSupplier = Pasteurized.gamepad1().leftStickY();
// the value of the stick
enhancedNumberSupplier.state();
// EnhancedNumberSuppliers also interact well with building complex EnhancedBooleanSuppliers from ranges
EnhancedBooleanSupplier rangeBasedCondition = enhancedNumberSupplier.conditionalBindState()
.greaterThan(-0.5)
.lessThan(0.5)
.bind();
// this system is fairly intuitive, and works best if you list numbers from smallest to largest,
// or in pairs e.g.:
EnhancedBooleanSupplier complexRangeBasedCondition = enhancedNumberSupplier.conditionalBindState()
.greaterThan(0.0)
.lessThan(10.0)
.greaterThanEqualTo(1.0)
.lessThanEqualTo(1000.0)
.bind();
// note: the Pasteurized gamepads have remaps for all gamepad buttons and inputs, the inputs that are shared across the different gamepad types
// but share a name (i.e. cross on a ps4 controller and a on a logitech or x-box controller) are linked together on the Pasteurized gamepad
Pasteurized uses EnhancedBooleanSuppliers and EnhancedNumericSuppliers.
Go take a read for further usage of those
Modifying the global gamepads:
// you can also reassign the buttons on the gamepads themselves, if you wish to make a change more global
Pasteurized.gamepad2().a(
Pasteurized.gamepad1().a().or(Pasteurized.gamepad2().a())
);
Pasteurized.gamepad1().a(Pasteurized.gamepad2().a());
// now either the driver or the operator can trigger this condition!
// or, you can build a gamepad yourself, (see below for more on this) and
// re-assign the whole gamepad!
// new SDKGamepad() will build a default gamepad from an sdk gamepad
// so this would reset gamepad1
Pasteurized.gamepad1(new SDKGamepad(gamepad1));
// or we could merge the two together
Pasteruized.gamepad2(Pasteruized.gamepad1());
Layering:
// we'll use this enum
enum Layers {
TELEOP,
ENDGAME
}
// WARNING: once you add a gamepad to a layering system, it will cease to function normally
// when a gamepad is put into a layering system, it is modified to go to being 'at-rest' when its not the active layer for the system
// 'at-rest' gamepads have 0 for all axis, and false for all buttons
// If you want to get more advanced, you can use a layering system to control the layers of your gamepad
// gamepads on inactive layers will immediately go to an 'at-rest' state, layering systems achieve this by modifying all gamepads given to it
SDKGamepad teleopGamepad = new SDKGamepad(gamepad1);
// WARNING: if your layering system is not very stable, you will need to be careful, as a layered gamepad will crash if it can't find a gamepad for the current layer
SDKGamepad endgameGamepad = new SDKGamepad(gamepad1);
// there are lots of generics here, this just allows us to use this system with a whole bunch of different systems, like Mercurial
Map<Layers, PasteurizedGamepad<EnhancedDoubleSupplier, EnhancedBooleanSupplier>> pasteurizedGamepadMap = new HashMap<Layers, PasteurizedGamepad<EnhancedDoubleSupplier, EnhancedBooleanSupplier>>(){{
put(Layers.TELEOP, teleopGamepad);
put(Layers.ENDGAME, endgameGamepad);
}};
MapLayeringSystem<Layers, EnhancedDoubleSupplier, EnhancedBooleanSupplier, PasteurizedGamepad<EnhancedDoubleSupplier, EnhancedBooleanSupplier>> enumLayeringSystem = new MapLayeringSystem<>(Layers.TELEOP, pasteurizedGamepadMap);
// LayeredGamepad takes a LayeringSystem and makes a gamepad from it
LayeredGamepad<EnhancedDoubleSupplier, EnhancedBooleanSupplier, PasteurizedGamepad<EnhancedDoubleSupplier, EnhancedBooleanSupplier>> layeredGamepad = new LayeredGamepad<>(enumLayeringSystem);
layeredGamepad.a(); // a from teleopGamepad
enumLayeringSystem.setLayer(Layers.ENDGAME);
layeredGamepad.a(); // a from endgameGamepad
// there are many more options for a layering system, and its fairly easy to implement your own!
// additionally, you can nest layered gamepads in other layered gamepads
// linking across layers using or
teleopGamepad.b(teleopGamepad.b().or(endgameGamepad.b()));
endgameGamepad.b(teleopGamepad.b());
// now b on both layers is linked!
// returns true if this gamepad is active on this layering system
enumLayeringSystem.isActive(teleopGamepad);
enumLayeringSystem.getLayer(); // current layer
enumLayeringSystem.getGamepad(); // current gamepad
//
// Other Layering Systems
//
// the map layering system can be used for any hashable type, but is probably best for enums
Map<String, PasteurizedGamepad<EnhancedDoubleSupplier, EnhancedBooleanSupplier>> pasteurizedGamepadMap2 = new HashMap<>();
pasteurizedGamepadMap2.put("one", teleopGamepad);
pasteurizedGamepadMap2.put("two", endgameGamepad);
MapLayeringSystem<String, EnhancedDoubleSupplier, EnhancedBooleanSupplier, PasteurizedGamepad<EnhancedDoubleSupplier, EnhancedBooleanSupplier>> stringLayeringSystem = new MapLayeringSystem<>("one", pasteurizedGamepadMap2);
// list layering system can move linearly
ListLayeringSystem<EnhancedDoubleSupplier, EnhancedBooleanSupplier, PasteurizedGamepad<EnhancedDoubleSupplier, EnhancedBooleanSupplier>> listLayeringSystem = new ListLayeringSystem<>(teleopGamepad, endgameGamepad);
// next in the list
listLayeringSystem.next();
// previous in the list
listLayeringSystem.previous();
// you can't go out of bounds
// wrapping layering system is similar, but when you reach the end of the bounds, it wraps back to the start
WrappingLayeringSystem<EnhancedDoubleSupplier, EnhancedBooleanSupplier, PasteurizedGamepad<EnhancedDoubleSupplier, EnhancedBooleanSupplier>> wrappingLayeringSystem = new WrappingLayeringSystem<>(teleopGamepad, endgameGamepad);
// next in the list
wrappingLayeringSystem.next();
// we've reached the end, so back to the start
wrappingLayeringSystem.next();
// we've reached the start of the list, so back to the end
wrappingLayeringSystem.previous();
You can then write code to figure out when to change layers, or write your own.
Pasteurized uses a bunch of generics in order to allow it to work with systems like Mercurial, which is much nicer in Kotlin than in Java.
Assistant
Responses are generated using AI and may contain mistakes.