diff --git a/light9/collector/device.py b/light9/collector/device.py --- a/light9/collector/device.py +++ b/light9/collector/device.py @@ -4,6 +4,8 @@ import math from light9.namespaces import L9, RDF, DEV from rdflib import Literal from webcolors import hex_to_rgb, rgb_to_hex +from colormath.color_objects import sRGBColor, CMYColor +import colormath.color_conversions log = logging.getLogger('device') @@ -33,7 +35,7 @@ def clamp255(x): return min(255, max(0, x)) def _8bit(f): - if not isinstance(f, float): + if not isinstance(f, (int, float)): raise TypeError(repr(f)) return clamp255(int(f * 255)) @@ -61,10 +63,28 @@ def toOutputAttrs(deviceType, deviceAttr if out is None: return default return float(out.toPython()) + + def rgbAttr(attr): + color = deviceAttrSettings.get(attr, '#000000') + r, g, b = hex_to_rgb(color) + return r, g, b + + def cmyAttr(attr): + rgb = sRGBColor.new_from_rgb_hex(deviceAttrSettings.get(attr, '#000000')) + out = colormath.color_conversions.convert_color(rgb, CMYColor) + return ( + _8bit(out.cmy_c), + _8bit(out.cmy_m), + _8bit(out.cmy_y)) + + def fine16Attr(attr): + x = floatAttr(attr) + hi = _8bit(x) + lo = _8bit((x * 255) % 1.0) + return hi, lo if deviceType == L9['ChauvetColorStrip']: - color = deviceAttrSettings.get(L9['color'], '#000000') - r, g, b = hex_to_rgb(color) + r, g, b = rgbAttr(L9['color']) return { L9['mode']: 215, L9['red']: r, @@ -95,5 +115,78 @@ def toOutputAttrs(deviceType, deviceAttr L9['goboShake']: 0, L9['goboChoose']: 0, } + elif deviceType == L9['ChauvetHex12']: + out = {} + out[L9['red']], out[L9['green']], out[L9['blue']] = r, g, b = rgbAttr(L9['color']) + out[L9['amber']] = 0 + out[L9['white']] = min(r, g, b) + out[L9['uv']] = _8bit(floatAttr(L9['uv'])) + return out + elif deviceType == L9['MacAura']: + out = { + L9['shutter']: 22, + L9['dimmer']: 255, + L9['zoom']: _8bit(floatAttr(L9['zoom'])), + L9['fixtureControl']: 0, + L9['colorWheel']: 0, + L9['colorTemperature']: 128, + L9['fx1Select']: 0, + L9['fx1Adjust']: 0, + L9['fx2Select']: 0, + L9['fx2Adjust']: 0, + L9['fxSync']: 0, + L9['auraShutter']: 22, + L9['auraDimmer']: 0, + L9['auraColorWheel']: 0, + L9['auraRed']: 0, + L9['auraGreen']: 0, + L9['auraBlue']: 0, + } + out[L9['pan']], out[L9['panFine']] = fine16Attr(L9['rx']) + out[L9['tilt']], out[L9['tiltFine']] = fine16Attr(L9['ry']) + out[L9['red']], out[L9['green']], out[L9['blue']] = rgbAttr(L9['color']) + out[L9['white']] = 0 + + return out + elif deviceType == L9['MacQuantum']: + out = { + L9['dimmerFadeLo']: 0, + L9['shutter']: 30, # strobe is in here too: slow @ 50 -> fast @ 200 + L9['fixtureControl']: 0, + L9['fx1Select']: 0, + L9['fx1Adjust']: 0, + L9['fx2Select']: 0, + L9['fx2Adjust']: 0, + L9['fxSync']: 0, + } + + # note these values are set to 'fade', so they update slowly. Haven't found where to turn that off. + out[L9['cyan']], out[L9['magenta']], out[L9['yellow']] = cmyAttr(L9['color']) + + out[L9['focusHi']], out[L9['focusLo']] = fine16Attr(L9['focus']) + out[L9['panHi']], out[L9['panLo']] = fine16Attr(L9['rx']) + out[L9['tiltHi']], out[L9['tiltLo']] = fine16Attr(L9['ry']) + out[L9['zoomHi']], out[L9['zoomLo']] = fine16Attr(L9['zoom']) + out[L9['dimmerFadeHi']] = 0 if deviceAttrSettings.get(L9['color'], '#000000') == '#000000' else 255 + + out[L9['goboChoice']] = { + L9['open']: 0, + L9['spider']: 6, + L9['windmill']: 11, + L9['limbo']: 16, + L9['brush']: 21, + L9['whirlpool']: 26, + L9['stars']: 31, + }[deviceAttrSettings.get(L9['gobo'], L9['open'])] + + out.update( { + L9['colorWheel']: 0, + L9['goboSpeedHi']: 0, + L9['goboSpeedLo']: 0, + L9['goboStaticRotate']: 0, + L9['prismRotation']: _8bit(floatAttr(L9['prism'])), + L9['iris']: _8bit(floatAttr(L9['iris']) * (200/255)), + }) + return out else: raise NotImplementedError('device %r' % deviceType) diff --git a/requirements.txt b/requirements.txt --- a/requirements.txt +++ b/requirements.txt @@ -31,4 +31,5 @@ txzmq==0.7.4 pyusb==1.0.0 coverage==4.1 klein==15.3.1 -git+http://github.com/drewp/scales.git@448d59fb491b7631877528e7695a93553bfaaa93#egg=scales \ No newline at end of file +git+http://github.com/drewp/scales.git@448d59fb491b7631877528e7695a93553bfaaa93#egg=scales +colormath==2.1.1 diff --git a/show/dance2016/deviceClass.n3 b/show/dance2016/deviceClass.n3 --- a/show/dance2016/deviceClass.n3 +++ b/show/dance2016/deviceClass.n3 @@ -1,11 +1,16 @@ @prefix : . @prefix rdfs: . -:color a :DeviceAttr; :dataType :color . -:rx a :DeviceAttr; :dataType :angle . -:ry a :DeviceAttr; :dataType :angle . -:uv a :DeviceAttr; :dataType :scalar . -:brightness a :DeviceAttr; :dataType :scalar . +:color a :DeviceAttr; :dataType :color . +:rx a :DeviceAttr; :dataType :angle . +:ry a :DeviceAttr; :dataType :angle . +:uv a :DeviceAttr; :dataType :scalar . +:brightness a :DeviceAttr; :dataType :scalar . +:zoom a :DeviceAttr; :dataType :scalar ; rdfs:comment "maybe a 'wide to narrow' type" . +:focus a :DeviceAttr; :dataType :scalar . +:iris a :DeviceAttr; :dataType :scalar . +:quantumGoboChoice a :DeviceAttr; :dataType :choice; + :choice :open, :spider, :windmill, :limbo, :brush, :whirlpool, :stars . :SimpleDimmer a :DeviceClass; :deviceAttr :brightness; @@ -51,6 +56,7 @@ :MacAura a :DeviceClass; :docs ; rdfs:comment "note- manual counts dmx from 1; :dmxOffset is from 0"; + :deviceAttr :color, :rx, :ry, :zoom; :attr [ :dmxOffset 0 ; :outputAttr :shutter ], # use 22 [ :dmxOffset 1 ; :outputAttr :dimmer ], @@ -80,6 +86,7 @@ :MacQuantum a :DeviceClass; :docs ; + :deviceAttr :color, :rx, :ry, :zoom, :focus, :iris, :quantumGoboChoice; :attr [ :dmxOffset 0; :outputAttr :shutter ; rdfs:comment "use 30" ], [ :dmxOffset 1; :outputAttr :dimmerFadeHi ], diff --git a/show/dance2016/theaterLightConfig.n3 b/show/dance2016/theaterLightConfig.n3 --- a/show/dance2016/theaterLightConfig.n3 +++ b/show/dance2016/theaterLightConfig.n3 @@ -1,18 +1,72 @@ @prefix : . @prefix rdfs: . @prefix dev: . -@prefix udmx: . -@prefix dmx0: . +@prefix udmxB: . +@prefix dmxA: . + +#dev:colorStrip a :ChauvetColorStrip; :dmxUniverse dmxA:; :dmxBase 87 . +#dev:moving1 a :Mini15; rdfs:label "moving1"; :dmxUniverse udmxB:; :dmxBase 5 . + +dev:houseSide a :SimpleDimmer; rdfs:label "house-side"; :dmxUniverse dmxA:; :dmxBase 68 . +dev:house1 a :SimpleDimmer; rdfs:label "house1"; :dmxUniverse dmxA:; :dmxBase 69 . +dev:house4 a :SimpleDimmer; rdfs:label "house4"; :dmxUniverse dmxA:; :dmxBase 70 . +dev:house3 a :SimpleDimmer; rdfs:label "house3"; :dmxUniverse dmxA:; :dmxBase 71 . +dev:house2 a :SimpleDimmer; rdfs:label "house2"; :dmxUniverse dmxA:; :dmxBase 72 . -dev:colorStrip a :ChauvetColorStrip; :dmxUniverse dmx0:; :dmxBase 87 . +dev:f1 a :SimpleDimmer; :dmxUniverse dmxA:; :dmxBase 4 . +dev:f2 a :SimpleDimmer; :dmxUniverse dmxA:; :dmxBase 8 . +dev:f3 a :SimpleDimmer; :dmxUniverse dmxA:; :dmxBase 10 . + +dev:cycR a :SimpleDimmer; :dmxUniverse dmxA:; :dmxBase 42 . +dev:cycL a :SimpleDimmer; :dmxUniverse dmxA:; :dmxBase 44 . + +dev:q1 a :MacQuantum; :dmxUniverse udmxB:; :dmxBase 325 . +dev:q2 a :MacQuantum; :dmxUniverse udmxB:; :dmxBase 352 . +dev:q3 a :MacQuantum; :dmxUniverse udmxB:; :dmxBase 379 . + +dev:aura1 a :MacAura; :dmxUniverse udmxB:; :dmxBase 406 . +dev:aura2 a :MacAura; :dmxUniverse udmxB:; :dmxBase 420 . +dev:aura3 a :MacAura; :dmxUniverse udmxB:; :dmxBase 434 . +dev:aura4 a :MacAura; :dmxUniverse udmxB:; :dmxBase 448 . +dev:aura5 a :MacAura; :dmxUniverse udmxB:; :dmxBase 462 . +dev:auraStage a :MacAura; :dmxUniverse udmxB:; :dmxBase 476; rdfs:comment "rx=.5 ry<.45" . -dev:moving1 a :Mini15; rdfs:label "moving1"; :dmxUniverse udmx:; :dmxBase 5 . - -dev:cyc a :SimpleDimmer; rdfs:label "cyc"; :dmxUniverse udmx:; :dmxBase 40 . +dev:hexBacklight1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 241 . +dev:hexBacklight2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 247 . +dev:hexBacklight3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 253 . +dev:hexBacklight4 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 259 . +dev:hexBacklight5 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 265 . +dev:hexDown2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 157 . +dev:hexDown3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 193 . +dev:hexDown4 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 169 . +dev:hexDown5Edge a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 175 . +dev:hexLip1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 121 . +dev:hexLip2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 127 . +dev:hexLip3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 133 . +dev:hexLip4 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 139 . +dev:hexLip5 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 145 . +dev:hexLow3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 223 . +dev:hexLow5 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 229 . +dev:hexLowBacklight1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 211 . +dev:hexLowBacklight6 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 235 . +dev:hexSlant a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 319 . +dev:hexUpCenter a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 313 . +dev:hexPostL1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 289 . +dev:hexPostL2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 295 . +dev:hexPostL3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 301 . +dev:hexPostR1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 271 . +dev:hexPostR2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 277 . +dev:hexPostR3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 283 . +dev:hexVeryLow1 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 151 . +dev:hexVeryLow2 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 187 . +dev:hexVeryLow22 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 217 . +dev:hexVeryLow3 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 163 . +dev:hexVeryLow4 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 199 . +dev:hexVeryLow5 a :ChauvetHex12; :dmxUniverse udmxB:; :dmxBase 205 . -# [ :name "cyc-right"; :output dmx:c42 ] . -# [ :name "cyc-mid"; :output dmx:c43 ] . -# [ :name "cyc-left"; :output dmx:c44 ] . + + + # [ :name "oran1"; :output dmx:c21 ] . # [ :name "oran2"; :output dmx:c25 ] . # [ :name "oran3"; :output dmx:c29 ] .