001/************************* PROJECT RON *************************/
002/* Copyright (c) 2026 StuyPulse Robotics. All rights reserved. */
003/* Use of this source code is governed by an MIT-style license */
004/* that can be found in the repository LICENSE file.           */
005/***************************************************************/
006package com.stuypulse.robot.subsystems.leds;
007
008import com.stuypulse.robot.constants.Ports;
009import com.stuypulse.robot.constants.Settings;
010import edu.wpi.first.wpilibj.AddressableLED;
011import edu.wpi.first.wpilibj.AddressableLEDBuffer;
012import edu.wpi.first.wpilibj.AddressableLEDBufferView;
013import edu.wpi.first.wpilibj.LEDPattern;
014import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
015import edu.wpi.first.wpilibj2.command.SubsystemBase;
016
017public class LEDController extends SubsystemBase {
018
019    private static final LEDController instance;
020
021    private final LEDPattern defaultPattern = LEDPattern.kOff;
022
023    private AddressableLED led;
024
025    private AddressableLEDBuffer buffer;
026
027    private AddressableLEDBufferView shooterView;
028
029    private AddressableLEDBufferView feederView;
030
031    private AddressableLEDBufferView intakeView;
032
033    private AddressableLEDBufferView handoffView;
034
035    static {
036        instance = new LEDController();
037    }
038
039    public static LEDController getInstance() {
040        return instance;
041    }
042
043    protected LEDController() {
044        this.led = new AddressableLED(Ports.LED.LED_PWM_PORT);
045        this.buffer = new AddressableLEDBuffer(Settings.LED.LED_LENGTH);
046        led.setLength(buffer.getLength());
047        led.setData(buffer);
048        led.start();
049        this.shooterView = buffer.createView(Settings.LED.SHOOTER_BUFFER[0], Settings.LED.SHOOTER_BUFFER[1]);
050        this.feederView = buffer.createView(Settings.LED.FEEDER_BUFFER[0], Settings.LED.FEEDER_BUFFER[1]);
051        this.intakeView = buffer.createView(Settings.LED.INTAKE_BUFFER[0], Settings.LED.INTAKE_BUFFER[1]);
052        this.handoffView = buffer.createView(Settings.LED.HANDOFF_BUFFER[0], Settings.LED.HANDOFF_BUFFER[1]);
053        applyPattern(defaultPattern);
054        SmartDashboard.putData(instance);
055    }
056
057    public void applyShoot(LEDPattern pattern) {
058        pattern.applyTo(shooterView);
059    }
060
061    public void applyFeed(LEDPattern pattern) {
062        pattern.applyTo(feederView);
063    }
064
065    public void applyIntake(LEDPattern pattern) {
066        pattern.applyTo(intakeView);
067    }
068
069    public void applyHandoff(LEDPattern pattern) {
070        pattern.applyTo(handoffView);
071    }
072
073    public void applyPattern(LEDPattern pattern) {
074        pattern.applyTo(buffer);
075    }
076
077    @Override
078    public void periodic() {
079        if (!Settings.EnabledSubsystems.LED.get()) {
080            LEDPattern.kOff.applyTo(buffer);
081        }
082        led.setData(buffer);
083    }
084}