Massive hsv math fix and configs can be passed now for most things
This commit is contained in:
parent
2ad1fe8a9c
commit
5334e7e0be
@ -80,6 +80,7 @@ class Firmware:
|
|||||||
|
|
||||||
hid_helper = USB_HID
|
hid_helper = USB_HID
|
||||||
|
|
||||||
|
# Split config
|
||||||
extra_data_pin = None
|
extra_data_pin = None
|
||||||
split_offsets = ()
|
split_offsets = ()
|
||||||
split_flip = False
|
split_flip = False
|
||||||
@ -90,9 +91,21 @@ class Firmware:
|
|||||||
uart = None
|
uart = None
|
||||||
uart_flip = True
|
uart_flip = True
|
||||||
uart_pin = None
|
uart_pin = None
|
||||||
|
|
||||||
|
# RGB config
|
||||||
pixel_pin = None
|
pixel_pin = None
|
||||||
num_pixels = None
|
num_pixels = None
|
||||||
rgb_order = (1, 0, 2) # GRB WS2812
|
rgb_order = (1, 0, 2) # GRB WS2812
|
||||||
|
val_limit = 255
|
||||||
|
hue_default = 0
|
||||||
|
sat_default = 100
|
||||||
|
val_default = val_limit
|
||||||
|
hue_step = 1
|
||||||
|
sat_step = 1
|
||||||
|
val_step = 1
|
||||||
|
animation_speed = 1
|
||||||
|
breathe_center = 1.5 # 1.0-2.7
|
||||||
|
animation_mode = 'static'
|
||||||
pixels = None
|
pixels = None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -210,7 +223,11 @@ class Firmware:
|
|||||||
self.uart = self.init_uart(self.uart_pin)
|
self.uart = self.init_uart(self.uart_pin)
|
||||||
|
|
||||||
if self.pixel_pin is not None:
|
if self.pixel_pin is not None:
|
||||||
self.pixels = rgb.RGB(self.pixel_pin, self.rgb_order, self.num_pixels)
|
self.pixels = rgb.RGB(self.pixel_pin, self.rgb_order, self.num_pixels,
|
||||||
|
self.hue_step, self.sat_step, self.val_step,
|
||||||
|
self.hue_default, self.sat_default, self.val_default,
|
||||||
|
self.breathe_center, self.val_limit, self.animation_mode
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
self.matrix = MatrixScanner(
|
self.matrix = MatrixScanner(
|
||||||
@ -268,6 +285,9 @@ class Firmware:
|
|||||||
if self.debug_enabled and state_changed:
|
if self.debug_enabled and state_changed:
|
||||||
print('New State: {}'.format(self._state._to_dict()))
|
print('New State: {}'.format(self._state._to_dict()))
|
||||||
|
|
||||||
|
if self.debug_enabled and state_changed and self.pixels.enabled:
|
||||||
|
print('New State: {}'.format(self.pixels))
|
||||||
|
|
||||||
if self.pixels.animation_mode is not None:
|
if self.pixels.animation_mode is not None:
|
||||||
self.pixels = self.pixels.animate()
|
self.pixels = self.pixels.animate()
|
||||||
|
|
||||||
|
@ -175,6 +175,11 @@ def rgb_mode_breathe(key, state, *args, **kwargs):
|
|||||||
return state
|
return state
|
||||||
|
|
||||||
|
|
||||||
|
def rgb_mode_breathe_rainbow(key, state, *args, **kwargs):
|
||||||
|
state.config.pixels.animation_mode = 'breathing_rainbow'
|
||||||
|
return state
|
||||||
|
|
||||||
|
|
||||||
def rgb_mode_rainbow(key, state, *args, **kwargs):
|
def rgb_mode_rainbow(key, state, *args, **kwargs):
|
||||||
state.config.pixels.animation_mode = 'rainbow'
|
state.config.pixels.animation_mode = 'rainbow'
|
||||||
return state
|
return state
|
||||||
|
@ -638,6 +638,7 @@ make_key(names=('RGB_VAD',), on_press=handlers.rgb_vad)
|
|||||||
make_key(names=('RGB_MODE_PLAIN', 'RGB_M_P'), on_press=handlers.rgb_mode_static)
|
make_key(names=('RGB_MODE_PLAIN', 'RGB_M_P'), on_press=handlers.rgb_mode_static)
|
||||||
make_key(names=('RGB_MODE_BREATHE', 'RGB_M_B'), on_press=handlers.rgb_mode_breathe)
|
make_key(names=('RGB_MODE_BREATHE', 'RGB_M_B'), on_press=handlers.rgb_mode_breathe)
|
||||||
make_key(names=('RGB_MODE_RAINBOW', 'RGB_M_R'), on_press=handlers.rgb_mode_rainbow)
|
make_key(names=('RGB_MODE_RAINBOW', 'RGB_M_R'), on_press=handlers.rgb_mode_rainbow)
|
||||||
|
make_key(names=('RGB_MODE_BREATHE_RAINBOW', 'RGB_M_BR'), on_press=handlers.rgb_mode_breathe_rainbow)
|
||||||
make_key(
|
make_key(
|
||||||
names=('LEADER', 'LEAD'),
|
names=('LEADER', 'LEAD'),
|
||||||
on_press=handlers.leader_pressed,
|
on_press=handlers.leader_pressed,
|
||||||
|
79
kmk/rgb.py
79
kmk/rgb.py
@ -4,25 +4,31 @@ import time
|
|||||||
|
|
||||||
|
|
||||||
class RGB:
|
class RGB:
|
||||||
hue = 240
|
hue = 0
|
||||||
sat = 100
|
sat = 100
|
||||||
val = 80
|
val = 80
|
||||||
animation_mode = 'breathing'
|
|
||||||
pos = 0
|
pos = 0
|
||||||
time = floor(time.monotonic() * 10)
|
time = floor(time.monotonic() * 10)
|
||||||
intervals = (30, 20, 10, 5)
|
intervals = (30, 20, 10, 5)
|
||||||
speed = 120 # Bigger is slower
|
animation_speed = 1
|
||||||
enabled = True
|
enabled = True
|
||||||
neopixel = None
|
neopixel = None
|
||||||
rgbw = False
|
rgbw = False
|
||||||
num_pixels = 0
|
|
||||||
disable_auto_write = False
|
disable_auto_write = False
|
||||||
hue_step = 5
|
|
||||||
|
# Set by config
|
||||||
|
num_pixels = 0
|
||||||
|
hue_step = 1
|
||||||
sat_step = 5
|
sat_step = 5
|
||||||
val_step = 5
|
val_step = 5
|
||||||
limit_val = 255
|
breath_center = 1.5 # 1.0-2.7
|
||||||
|
val_limit = 255
|
||||||
|
animation_mode = 'static'
|
||||||
|
|
||||||
def __init__(self, pixel_pin, rgb_order, num_pixels=0):
|
def __init__(self, pixel_pin, rgb_order, num_pixels,
|
||||||
|
hue_step, sat_step, val_step,
|
||||||
|
hue_default, sat_default, val_default,
|
||||||
|
breath_center, val_limit, animation_mode):
|
||||||
try:
|
try:
|
||||||
import neopixel
|
import neopixel
|
||||||
self.neopixel = neopixel.NeoPixel(pixel_pin,
|
self.neopixel = neopixel.NeoPixel(pixel_pin,
|
||||||
@ -32,6 +38,15 @@ class RGB:
|
|||||||
if len(rgb_order) == 4:
|
if len(rgb_order) == 4:
|
||||||
self.rgbw = True
|
self.rgbw = True
|
||||||
self.num_pixels = num_pixels
|
self.num_pixels = num_pixels
|
||||||
|
self.hue_step = hue_step
|
||||||
|
self.sat_step = sat_step
|
||||||
|
self.val_step = val_step
|
||||||
|
self.hue = hue_default
|
||||||
|
self.sat = sat_default
|
||||||
|
self.val = val_default
|
||||||
|
self.breath_center = breath_center
|
||||||
|
self.val_limit = val_limit
|
||||||
|
self.animation_mode = animation_mode
|
||||||
|
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
print(e)
|
print(e)
|
||||||
@ -47,7 +62,7 @@ class RGB:
|
|||||||
'animation_mode': self.animation_mode,
|
'animation_mode': self.animation_mode,
|
||||||
'time': self.time,
|
'time': self.time,
|
||||||
'intervals': self.intervals,
|
'intervals': self.intervals,
|
||||||
'speed': self.speed,
|
'animation_speed': self.animation_speed,
|
||||||
'enabled': self.enabled,
|
'enabled': self.enabled,
|
||||||
'neopixel': self.neopixel,
|
'neopixel': self.neopixel,
|
||||||
'disable_auto_write': self.disable_auto_write,
|
'disable_auto_write': self.disable_auto_write,
|
||||||
@ -69,10 +84,9 @@ class RGB:
|
|||||||
r = 0
|
r = 0
|
||||||
g = 0
|
g = 0
|
||||||
b = 0
|
b = 0
|
||||||
self.limit_val = 255
|
|
||||||
|
|
||||||
if val > 255:
|
if val > self.val_limit:
|
||||||
val = 255
|
val = self.val_limit
|
||||||
|
|
||||||
if sat == 0:
|
if sat == 0:
|
||||||
r = val
|
r = val
|
||||||
@ -80,8 +94,8 @@ class RGB:
|
|||||||
b = val
|
b = val
|
||||||
|
|
||||||
else:
|
else:
|
||||||
base = ((255 - sat) * val) >> 8
|
base = ((100 - sat) * val) / 100
|
||||||
color = (val - base) * (hue % 60) / 60
|
color = floor((val - base) * ((hue % 60) / 60))
|
||||||
|
|
||||||
x = floor(hue / 60)
|
x = floor(hue / 60)
|
||||||
if x == 0:
|
if x == 0:
|
||||||
@ -183,7 +197,7 @@ class RGB:
|
|||||||
Decreases hue by step amount rolling at 0 and returning to 360
|
Decreases hue by step amount rolling at 0 and returning to 360
|
||||||
:param step:
|
:param step:
|
||||||
'''
|
'''
|
||||||
if self.hue - step < 0:
|
if (self.hue - step) <= 0:
|
||||||
self.hue = (self.hue + 360 - step) % 360
|
self.hue = (self.hue + 360 - step) % 360
|
||||||
else:
|
else:
|
||||||
self.hue = (self.hue - step) % 360
|
self.hue = (self.hue - step) % 360
|
||||||
@ -203,7 +217,7 @@ class RGB:
|
|||||||
Decreases saturation by step amount stopping at 0
|
Decreases saturation by step amount stopping at 0
|
||||||
:param step:
|
:param step:
|
||||||
'''
|
'''
|
||||||
if self.sat + step <= 0:
|
if (self.sat - step) <= 0:
|
||||||
self.sat = 0
|
self.sat = 0
|
||||||
else:
|
else:
|
||||||
self.sat -= step
|
self.sat -= step
|
||||||
@ -213,7 +227,7 @@ class RGB:
|
|||||||
Increases value by step amount stopping at 100
|
Increases value by step amount stopping at 100
|
||||||
:param step:
|
:param step:
|
||||||
'''
|
'''
|
||||||
if self.val + step >= 100:
|
if (self.val + step) >= 100:
|
||||||
self.val = 100
|
self.val = 100
|
||||||
else:
|
else:
|
||||||
self.val += step
|
self.val += step
|
||||||
@ -223,7 +237,7 @@ class RGB:
|
|||||||
Decreases value by step amount stopping at 0
|
Decreases value by step amount stopping at 0
|
||||||
:param step:
|
:param step:
|
||||||
'''
|
'''
|
||||||
if self.val + step <= 0:
|
if (self.val - step) <= 0:
|
||||||
self.val = 0
|
self.val = 0
|
||||||
else:
|
else:
|
||||||
self.val -= step
|
self.val -= step
|
||||||
@ -253,7 +267,9 @@ class RGB:
|
|||||||
return self.effect_breathing()
|
return self.effect_breathing()
|
||||||
elif self.animation_mode == 'rainbow':
|
elif self.animation_mode == 'rainbow':
|
||||||
return self.effect_rainbow()
|
return self.effect_rainbow()
|
||||||
if self.animation_mode == 'static':
|
elif self.animation_mode == 'breathing_rainbow':
|
||||||
|
return self.effect_breathing_rainbow()
|
||||||
|
elif self.animation_mode == 'static':
|
||||||
return self.effect_static()
|
return self.effect_static()
|
||||||
else:
|
else:
|
||||||
self.off()
|
self.off()
|
||||||
@ -275,34 +291,39 @@ class RGB:
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
def effect_breathing(self):
|
def effect_breathing(self):
|
||||||
RGBLIGHT_EFFECT_BREATHE_CENTER = 1.5 # 1.0-2.7
|
|
||||||
RGBLIGHT_EFFECT_BREATHE_MAX = 100 # 0-255
|
|
||||||
# http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/
|
# http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/
|
||||||
# https://github.com/qmk/qmk_firmware/blob/9f1d781fcb7129a07e671a46461e501e3f1ae59d/quantum/rgblight.c#L787
|
# https://github.com/qmk/qmk_firmware/blob/9f1d781fcb7129a07e671a46461e501e3f1ae59d/quantum/rgblight.c#L806
|
||||||
self.val = floor((exp(sin((self.pos/255.0)*pi)) - RGBLIGHT_EFFECT_BREATHE_CENTER/M_E)*
|
self.val = floor((exp(sin((self.pos / 255.0) * pi)) - self.breath_center / M_E) *
|
||||||
(RGBLIGHT_EFFECT_BREATHE_MAX/(M_E-1/M_E)))
|
(self.val_limit / (M_E - 1 / M_E)))
|
||||||
self.pos = (self.pos + 1) % 256;
|
self.pos = (self.pos + self.animation_speed) % 256
|
||||||
self.set_hsv_fill(self.hue, self.sat, self.val)
|
self.set_hsv_fill(self.hue, self.sat, self.val)
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def effect_breathing_rainbow(self):
|
||||||
|
if self.animation_step():
|
||||||
|
self.increase_hue(self.animation_speed)
|
||||||
|
self.effect_breathing()
|
||||||
|
|
||||||
|
return self
|
||||||
|
|
||||||
def effect_rainbow(self):
|
def effect_rainbow(self):
|
||||||
if self.animation_step(self):
|
if self.animation_step():
|
||||||
self.increase_hue(self.hue, 1)
|
self.increase_hue(self.animation_speed)
|
||||||
self.set_hsv_fill(self.hue, self.sat, self.val)
|
self.set_hsv_fill(self.hue, self.sat, self.val)
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def effect_rainbow_swirl(self):
|
def effect_rainbow_swirl(self):
|
||||||
interval = self.animation_step(self)
|
interval = self.animation_step()
|
||||||
if interval:
|
if interval:
|
||||||
for i in range(0, self.num_pixels):
|
for i in range(0, self.num_pixels):
|
||||||
self.hue = (360 / self.num_pixels * i + self.hue) % 360
|
self.hue = (360 / self.num_pixels * i + self.hue) % 360
|
||||||
self.set_hsv_fill(self.hue, self.sat, self.val)
|
self.set_hsv_fill(self.hue, self.sat, self.val)
|
||||||
|
|
||||||
if interval % 2:
|
if interval % 2:
|
||||||
self.increase_hue(self.hue, 1)
|
self.increase_hue(self.animation_speed)
|
||||||
else:
|
else:
|
||||||
self.decrease_hue(self.hue, 1)
|
self.decrease_hue(self.animation_speed)
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
@ -29,6 +29,13 @@ keyboard.debug_enabled = True
|
|||||||
|
|
||||||
keyboard.pixel_pin = board.TX
|
keyboard.pixel_pin = board.TX
|
||||||
keyboard.num_pixels = 12
|
keyboard.num_pixels = 12
|
||||||
|
keyboard.val_limit = 150
|
||||||
|
keyboard.hue_step = 5
|
||||||
|
keyboard.sat_step = 5
|
||||||
|
keyboard.val_step = 5
|
||||||
|
keyboard.hue_default = 260
|
||||||
|
keyboard.animation_speed = 1
|
||||||
|
|
||||||
OFF = (0, 0, 0)
|
OFF = (0, 0, 0)
|
||||||
BLUE = (0, 0, 100)
|
BLUE = (0, 0, 100)
|
||||||
CYAN = (0, 100, 100)
|
CYAN = (0, 100, 100)
|
||||||
@ -69,58 +76,74 @@ r3 = 4
|
|||||||
|
|
||||||
|
|
||||||
def base(*args, **kwargs):
|
def base(*args, **kwargs):
|
||||||
keyboard.pixel_state['animation_mode'] = 'breathing'
|
'''
|
||||||
keyboard.pixels.fill(OFF)
|
keyboard.pixels.animation_mode = 'breathing'
|
||||||
keyboard.pixels.show()
|
keyboard.pixels.neopixel(OFF)
|
||||||
|
keyboard.pixels.neopixelshow()
|
||||||
|
'''
|
||||||
return df_pressed(*args, **kwargs)
|
return df_pressed(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def layer1p(*args, **kwargs):
|
def layer1p(*args, **kwargs):
|
||||||
keyboard.pixel_state['animation_mode'] = 'User'
|
'''
|
||||||
keyboard.pixels.fill(WHITE)
|
keyboard.pixels.animation_mode = 'User'
|
||||||
keyboard.pixels.show()
|
keyboard.pixels.neopixel.fill(WHITE)
|
||||||
|
keyboard.pixels.neopixel.show()
|
||||||
|
'''
|
||||||
return mo_pressed(*args, **kwargs)
|
return mo_pressed(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def layer1r(*args, **kwargs):
|
def layer1r(*args, **kwargs):
|
||||||
keyboard.pixel_state['animation_mode'] = 'breathing'
|
'''
|
||||||
keyboard.pixels.fill(OFF)
|
keyboard.pixels.animation_mode = 'breathing'
|
||||||
keyboard.pixels.show()
|
keyboard.pixels.neopixel.fill(OFF)
|
||||||
|
keyboard.pixels.neopixel.show()
|
||||||
|
'''
|
||||||
return mo_released(*args, **kwargs)
|
return mo_released(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def layer2p(*args, **kwargs):
|
def layer2p(*args, **kwargs):
|
||||||
keyboard.pixel_state['animation_mode'] = 'User'
|
'''
|
||||||
keyboard.pixels.fill(BLUE)
|
keyboard.pixels.animation_mode = 'User'
|
||||||
keyboard.pixels.show()
|
keyboard.pixels.neopixel.fill(BLUE)
|
||||||
|
keyboard.pixels.neopixel.show()
|
||||||
|
'''
|
||||||
return lt_pressed(*args, **kwargs)
|
return lt_pressed(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def layer2r(*args, **kwargs):
|
def layer2r(*args, **kwargs):
|
||||||
keyboard.pixel_state['animation_mode'] = 'breathing'
|
'''
|
||||||
keyboard.pixels.fill(OFF)
|
keyboard.pixels.animation_mode = 'breathing'
|
||||||
keyboard.pixels.show()
|
keyboard.pixels.neopixel.fill(OFF)
|
||||||
|
keyboard.pixels.neopixel.show()
|
||||||
|
'''
|
||||||
return lt_released(*args, **kwargs)
|
return lt_released(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def layer3p(*args, **kwargs):
|
def layer3p(*args, **kwargs):
|
||||||
keyboard.pixel_state['animation_mode'] = 'User'
|
'''
|
||||||
keyboard.pixels.fill(PURPLE)
|
keyboard.pixels.animation_mode = 'User'
|
||||||
keyboard.pixels.show()
|
keyboard.pixels.neopixel.fill(PURPLE)
|
||||||
|
keyboard.pixels.neopixel.show()
|
||||||
|
'''
|
||||||
return mo_pressed(*args, **kwargs)
|
return mo_pressed(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def layer3r(*args, **kwargs):
|
def layer3r(*args, **kwargs):
|
||||||
keyboard.pixel_state['animation_mode'] = 'breathing'
|
'''
|
||||||
keyboard.pixels.fill(OFF)
|
keyboard.pixels.animation_mode = 'breathing'
|
||||||
keyboard.pixels.show()
|
keyboard.pixels.neopixel.fill(OFF)
|
||||||
|
keyboard.pixels.neopixel.show()
|
||||||
|
'''
|
||||||
return mo_released(*args, **kwargs)
|
return mo_released(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def gaming(*args, **kwargs):
|
def gaming(*args, **kwargs):
|
||||||
keyboard.pixel_state['animation_mode'] = 'User'
|
'''
|
||||||
keyboard.pixels.fill(CYAN)
|
keyboard.pixels.animation_mode = 'User'
|
||||||
keyboard.pixels.show()
|
keyboard.pixels.neopixel.fill(CYAN)
|
||||||
|
keyboard.pixels.neopixel.show()
|
||||||
|
'''
|
||||||
return df_pressed(*args, **kwargs)
|
return df_pressed(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
@ -205,10 +228,10 @@ keyboard.keymap = [
|
|||||||
],
|
],
|
||||||
[
|
[
|
||||||
# r3
|
# r3
|
||||||
[KC.GESC, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.F10, KC.F11, KC.F12, KC.DEL],
|
[KC.GESC, KC.RGB_HUI, KC.RGB_HUD, KC.RGB_SAI, KC.RGB_SAD, KC.RGB_VAI, KC.RGB_VAD, _______, KC.F10, KC.F11, KC.F12, KC.DEL],
|
||||||
[_______, _______, _______, _______, _______, _______, _______, _______, KC.F7, KC.F8, KC.F9, SHFT_INS],
|
[KC.RGB_M_P, _______, _______, _______, _______, _______, _______, _______, KC.F7, KC.F8, KC.F9, SHFT_INS],
|
||||||
[_______, _______, _______, _______, _______, _______, _______, _______, KC.F4, KC.F5, KC.F6, KC.VOLU],
|
[KC.RGB_M_B, _______, _______, _______, _______, _______, _______, _______, KC.F4, KC.F5, KC.F6, KC.VOLU],
|
||||||
[_______, _______, _______, _______, _______, _______, _______, _______, KC.F1, KC.F2, KC.F4, KC.VOLD],
|
[KC.RGB_M_BR, _______, _______, _______, _______, _______, _______, _______, KC.F1, KC.F2, KC.F4, KC.VOLD],
|
||||||
[BASE, GAMING, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX],
|
[BASE, GAMING, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX],
|
||||||
],
|
],
|
||||||
]
|
]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user