You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

97 lines
3.1 KiB

#!/usr/bin/env python3
#
# This script was used to work out how to map the RGB/brightness input
# data to GPIO pinout voltages.
maxV = 3.27
requirements = [
# Input # Expected output
(0, 0, 0, 1.00, False, None, None, None),
(255, 255, 255, 0.00, False, None, None, None),
(255, 0, 0, 0.01, True, 2.95, maxV, maxV),
(255, 255, 0, 0.01, True, 3.04, 2.86, 3.17),
(255, 255, 255, 0.01, True, 3.04, 2.86, 3.07),
(0, 255, 0, 0.01, True, 3.27, 2.95, 3.27),
(0, 255, 255, 0.01, True, 3.13, 2.86, 3.07),
(0, 0, 255, 0.01, True, 3.27, 3.27, 2.95),
(255, 0, 255, 0.01, True, 2.88, 3.12, 2.86),
]
def get_red(r, g, b, brightness):
if r == 0:
if g == 1 and b == 1:
v = round(3.1317 - brightness * 0.16, 2)
return v
else:
return maxV;
if g == 1:
v = round(r * (3.0417 - brightness * 0.48), 2)
elif b == 1:
v = round(r * (2.88 - (brightness - 0.01) * (2.88 - 1.85)), 2)
else:
v = round(r * (2.95 - (brightness - 0.01) * (2.95 - 1.82)), 2)
v = round(r * (2.9617 - brightness * 1.13), 2)
return v
def get_green(r, g, b, brightness):
if g == 0:
if r == 1 and b == 1:
return round(3.12 - (brightness - 0.01) * (3.12 - 2.92), 2)
else:
return maxV;
if r == 1:
v = round(g * (2.86 - (brightness - 0.01) * (2.86 - 1.77)), 2)
elif r == 0 and b == 1:
v = round(g * (2.86 - (brightness - 0.01) * (2.86 - 1.77)), 2)
else:
v = round(g * (2.95 - (brightness - 0.01) * (2.95 - 1.82)), 2)
return v
def get_blue(r, g, b, brightness):
if b == 0:
if r > 0 and g > 0:
return 3.17
else:
return maxV;
if r == 1 and g == 1:
v = round(r * (3.0717 - brightness * 0.48), 2)
elif r == 1 and g == 0:
v = round(r * (2.86 - (brightness - 0.01) * (2.86 - 1.77)), 2)
elif r == 0 and g == 1:
v = round(g * (3.0717 - brightness * 0.48), 2)
else:
v = round(b * (2.95 - (brightness - 0.01) * (2.95 - 1.82)), 2)
return v
def make_rgb_fractions(r, g, b):
""" These ought to be 0 to 1 on input already, but it won't
hurt to make sure they are."""
m = max(r, g, b)
r = r/m
g = g/m
b = b/m
return (r, g, b)
for r,g,b,brightness,stateExpected, rVexpected, gVexpected, bVexpected in requirements:
print(f"IN: {r}, {g}, {b} at {brightness} / ", end="")
print(f"EXP: ({stateExpected}) {rVexpected},{gVexpected},{bVexpected} ", end="")
state = True
if r + g + b == 0 or brightness == 0:
state = False
rV = None
gV = None
bV = None
else:
r, g, b = make_rgb_fractions(r, g, b)
rV = get_red(r, g, b, brightness)
gV = get_green(r, g, b, brightness)
bV = get_blue(r, g, b, brightness)
print(f"OUT: ({state}) {rV},{gV},{bV} ", end="")
if rV == rVexpected and gV == gVexpected and bV == bVexpected and state == stateExpected:
print(" [PASS]");
else:
print(" [FAIL]");