2022PythonExamples/19 - AddressableLED/Challenge/robot.py

81 lines
2.5 KiB
Python

import wpilib
import math
class MyRobot(wpilib.TimedRobot):
def robotInit(self):
self.width = 84
self.height = 56
self.buffer = wpilib.AddressableLED.LEDData(self.width * self.height)
self.leds = wpilib.AddressableLED(0)
self.leds.setLength(self.width * self.height)
self.leds.start()
self.hsvShift = 0
self.plasma = [[0] * self.width] * self.height
for i in range(self.width):
for j in range(self.height):
self.plasma[i][j] = int((128.0 + (128.0 * math.sin(i / 4.0)) + 128.0 + (128.0 * math.sin(j / 4.0))) / 2)
self.palette = [0] * 256
for i in range(len(self.palette)):
self.palette[i] = self.__hsvToColor(self.__map(i, 0, 255, 0, 359), 1, 1)
def robotPeriodic(self):
for i in range(self.width):
for j in range(self.height):
position = (self.plasma[i][j] + self.hsvShift) % 256
self.buffer.setLED((j * self.width) + i, self.palette[position])
self.hsvShift += 1
self.leds.setData(self.buffer)
def autonomousInit(self):
pass
def autonomousPeriodic(self):
pass
def teleopInit(self):
pass
def teleopPeriodic(self):
pass
def __map(self, x, inMin, inMax, outMin, outMax):
return int((x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin)
def __hsvToColor(self, h, s, v):
if s == 0:
return wpilib.Color(wpilib.Color8Bit(int(v * 255.0), int(v * 255.0), int(v * 255.0)))
htemp = h / 60.0
i = int(math.floor(htemp))
f = htemp - i
p = v * (1.0 - s)
q = v * (1.0 - s * f)
t = v * (1.0 - s * (1.0 - f))
if i == 0:
return wpilib.Color(wpilib.Color8Bit(int(v * 255.0), int(t * 255.0), int(p * 255.0)))
elif i == 1:
return wpilib.Color(wpilib.Color8Bit(int(q * 255.0), int(v * 255.0), int(p * 255.0)))
elif i == 2:
return wpilib.Color(wpilib.Color8Bit(int(p * 255.0), int(v * 255.0), int(t * 255.0)))
elif i == 3:
return wpilib.Color(wpilib.Color8Bit(int(p * 255.0), int(q * 255.0), int(v * 255.0)))
elif i == 4:
return wpilib.Color(wpilib.Color8Bit(int(t * 255.0), int(p * 255.0), int(v * 255.0)))
elif i == 5:
return wpilib.Color(wpilib.Color8Bit(int(v * 255.0), int(p * 255.0), int(q * 255.0)))
else:
return wpilib.Color(0, 0, 0)
if __name__ == "__main__":
wpilib.run(MyRobot)