@ -8,16 +8,12 @@ from pprint import pprint
import argparse
import colorsys
import gpiozero
import osc_client
import json
# Set up basic vars and logging
logging . basicConfig ( format = ' %(asctime)s - %(threadName)s ø %(name)s - '
' %(levelname)s - %(message)s ' )
log = logging . getLogger ( " ledserver " )
log = logging . getLogger ( " osc " )
log . setLevel ( logging . INFO )
osc_log = logging . getLogger ( " osc " )
osc_log . setLevel ( logging . WARNING )
clientname = " ledserver "
# Get the normalised RGB values for the HSV (i.e, the colour float designating hue from OSC)
@ -47,24 +43,21 @@ class LED:
state = False
# The pin number of the LED
pin = None
# The OSC target FX param
target = 0
name = " "
# List for logging state
mode = [ " off " , " on " ]
# Initialize the object, set up GPIO
def __init__ ( self , pin , target ) :
def __init__ ( self , pin ) :
self . pin = pin
self . target = target
self . led = gpiozero . PWMLED ( pin )
# Set the brightness, this only triggers on a delta threshold so that we don't go crazy
def set_brightness ( self , value ) :
if abs ( self . brightness - value ) > .005 :
self . brightness = value
self . led . value = self . state * self . brightness
log . info ( " Setting brightness for LED on pin {} to {} " . format ( self . pin , self . brightness ) )
print ( " Setting brightness for LED on pin {} to {} " . format ( self . pin , self . brightness ) )
# Set the colour, only on a delta threshold
def set_colour ( self , value ) :
@ -89,66 +82,17 @@ class LED:
# Set the colour of the LEDs. This only does the first LED, but when the REAPER controls are finalised, it'll be more controllable
def led_colour ( value ) :
for name , led in leds . items ( ) :
led . set_colour ( value )
leds [ 0 ] . set_colour ( value )
# Set the brightness of all LEDs. As above, when REAPER is finalised it'll be controllable (or everything, as required)
def led_brightness ( value ) :
for name , led in leds . items ( ) :
for led in leds :
led . set_brightness ( value )
# Turn an individual LED on or off based on FX param 3+
def led_state ( addr , value ) :
target = addr . split ( " / " ) [ 6 ]
for led in [ led for name , led in leds . items ( ) if led . target == target ] :
led . toggle_state ( bool ( value ) )
def btn_restart ( ) :
initialise ( )
osc_client . cmd_restart ( )
def btn_play ( ) :
osc_client . cmd_play ( )
def btn_stop ( ) :
osc_client . cmd_stop ( )
def initialise ( filename = ' config.json ' ) :
global config
global leds
global buttons
config = json . load ( open ( filename ) )
log . info ( " Creating LEDs... " )
# Create LEDs
if ' leds ' in globals ( ) :
del leds
leds = { led [ ' name ' ] : LED ( led [ ' pin ' ] , led [ ' target ' ] ) for led in config [ ' outputs ' ] [ ' leds ' ] }
for led in config [ ' outputs ' ] [ ' leds ' ] :
if " defaults " not in led :
led [ ' defaults ' ] = { }
for i in config [ ' outputs ' ] [ ' defaults ' ] [ ' led ' ] . keys ( ) :
led [ ' defaults ' ] [ i ] = config [ ' outputs ' ] [ ' defaults ' ] [ ' led ' ] [ i ]
state = led [ ' defaults ' ] [ " state " ] if " state " in led [ " defaults " ] else config [ ' outputs ' ] [ " defaults " ] [ ' led ' ] [ " state " ]
colour = led [ ' defaults ' ] [ ' colour ' ] if ' colour ' in led [ ' defaults ' ] else config [ ' outputs ' ] [ ' defaults ' ] [ ' led ' ] [ ' colour ' ]
brightness = led [ ' defaults ' ] [ ' brightness ' ] if ' brightness ' in led [ ' defaults ' ] else config [ ' outputs ' ] [ ' defaults ' ] [ ' led ' ] [ ' brightness ' ]
leds [ led [ ' name ' ] ] . set_state ( bool ( state ) )
leds [ led [ ' name ' ] ] . set_colour ( colour )
leds [ led [ ' name ' ] ] . set_brightness ( brightness )
# Don't re-initialise buttons, specifically because we expect this to be called by a button
# And unassigning the calling button will probably break things
if ' buttons ' not in globals ( ) :
buttons = { }
for name , button in config [ ' inputs ' ] [ ' buttons ' ] . items ( ) :
log . info ( ' Binding button {} to pin {} ' . format ( name , button [ ' pin ' ] ) )
buttons [ name ] = gpiozero . Button ( button [ ' pin ' ] )
log . info ( ' Binding button {} when_pressed to {} ' . format ( name , button [ ' when_pressed ' ] ) )
buttons [ name ] . when_pressed = globals ( ) [ ' btn_ ' + button [ ' when_pressed ' ] ]
pprint ( buttons [ name ] . when_pressed )
led = addr . split ( " / " ) [ 6 ]
leds [ int ( led ) - 3 ] . toggle_state ( bool ( value ) )
# Set up command line arguments
@ -164,7 +108,7 @@ log.info("Starting OSC...")
# Log OSC stuff if requested
if args . debug_osc :
osc_startup ( logger = osc_ log)
osc_startup ( logger = log )
else :
osc_startup ( )
@ -185,10 +129,10 @@ osc_method("/track/2/fx/1/fxparam/2/value",led_brightness)
osc_method ( " /track/2/fx/1/fxparam/[!12]/value " , led_state , argscheme = OSCARG_ADDRESS + OSCARG_DATAUNPACK )
log . info ( " Creating LEDs... " )
initialise ( )
#restart_button=gpiozero.Button(2)
#restart_button.when_pressed=osc_client.cmd_restart
# Create LEDs
leds = [ LED ( i ) for i in [ 16 , 20 , 21 ] ]
# Do a massive loop listening for messages. This should really be cleaner...