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}