From 9e689b32e82ed19654aa018cd2d4c5ff3576ee02 Mon Sep 17 00:00:00 2001 From: Ben Connors Date: Mon, 25 Feb 2019 17:17:30 -0500 Subject: Add curved outputs - Prolong life, different fades - Wrap current output --- blc/output.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/blc/output.py b/blc/output.py index 147ea6b..dfe9a3d 100644 --- a/blc/output.py +++ b/blc/output.py @@ -1,9 +1,10 @@ """DMX module. -Defines a generic interface for a DMX interface. +Defines a generic interface for a DMX interface along with some utility interfaces. """ from abc import ABC, abstractmethod +import array class LightingOutput(ABC): """Generic lighting interface.""" @@ -40,3 +41,30 @@ class ChainedLightingOutput(LightingOutput): def __init__(self, *outputs): self.outputs = outputs self.trans_time = min((i.trans_time for i in outputs)) + +class CurvedOutput(LightingOutput): + """Class for using a custom dimmer curve. + + The given f may be a callable (which must accept integers from 0--255, inclusive) or a list + of 256 values, with f[0] representing the output at 0 and f[255] the output at 255. + """ + def set_values(self, values): + self.output.set_values(map(self.map, values)) + + def __init__(self, output, f=lambda x: x): + self.output = output + self.trans_time = output.trans_time + if callable(f): + self.curve = array.array('B', (f(i) for i in range(256))) + else: + self.curve = array.array('B', f) + self.map = lambda a: (a[0], self.curve[a[1]],) + +## Enforce that all lights remain on at 5% +LINEAR_PREHEAT = lambda x: int(243/255*x + 12) + +## Enforce that all lights stay below 95% +LINEAR_TOPSET = lambda x: int(243/255*x) + +## Enforce that all lights remain in the 5%--95% range +LINEAR_BOTH = lambda x: int(231/255*x + 12) -- cgit v1.2.3