#!/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]");